Merge branch 'master' into blender2.8
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Tue, 21 Aug 2018 17:08:23 +0000 (19:08 +0200)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Tue, 21 Aug 2018 17:08:23 +0000 (19:08 +0200)
1  2 
release/scripts/startup/bl_ui/space_userpref.py
source/blender/blenfont/BLF_api.h
source/blender/blenfont/intern/blf_glyph.c
source/blender/editors/interface/interface_style.c
source/blender/makesdna/DNA_userdef_types.h
source/blender/makesrna/intern/rna_userdef.c

index ddcc19a37817bba2e3897d8ea90f679aeba8dd0d,26facd251748f163c1ebb57b9fbce95fe7ff2ac0..4e12dcc75d465fd3f8d3abe7f8680fb25dbd082e
@@@ -22,20 -22,37 +22,20 @@@ from bpy.types import 
      Header,
      Menu,
      Panel,
 +    Operator,
  )
  from bpy.app.translations import pgettext_iface as iface_
  from bpy.app.translations import contexts as i18n_contexts
  
  
 -def opengl_lamp_buttons(column, lamp):
 -    split = column.row()
 -
 -    split.prop(lamp, "use", text="", icon='OUTLINER_OB_LAMP' if lamp.use else 'LAMP_DATA')
 -
 -    col = split.column()
 -    col.active = lamp.use
 -    row = col.row()
 -    row.label(text="Diffuse:")
 -    row.prop(lamp, "diffuse_color", text="")
 -    row = col.row()
 -    row.label(text="Specular:")
 -    row.prop(lamp, "specular_color", text="")
 -
 -    col = split.column()
 -    col.active = lamp.use
 -    col.prop(lamp, "direction", text="")
 -
 -
  class USERPREF_HT_header(Header):
      bl_space_type = 'USER_PREFERENCES'
  
      def draw(self, context):
          layout = self.layout
  
 -        layout.template_header()
 +        # No need to show type selector.
 +        # layout.template_header()
  
          userpref = context.user_preferences
  
              layout.operator("wm.addon_install", icon='FILESEL')
              layout.operator("wm.addon_refresh", icon='FILE_REFRESH')
              layout.menu("USERPREF_MT_addons_online_resources")
 +        elif userpref.active_section == 'LIGHTS':
 +            layout.operator('wm.studiolight_install', text="Install MatCap").orientation = 'MATCAP'
 +            layout.operator('wm.studiolight_install', text="Install World HDRI").orientation = 'WORLD'
 +            layout.operator('wm.studiolight_install', text="Install Camera HDRI").orientation = 'CAMERA'
          elif userpref.active_section == 'THEMES':
              layout.operator("ui.reset_default_theme")
              layout.operator("wm.theme_install")
@@@ -202,63 -215,48 +202,63 @@@ class USERPREF_PT_interface(Panel)
          userpref = context.user_preferences
          view = userpref.view
  
 -        row = layout.row()
 -
 +        split = layout.split()
 +        row = split.row()
          col = row.column()
 +
          col.label(text="Display:")
          col.prop(view, "ui_scale", text="Scale")
          col.prop(view, "ui_line_width", text="Line Width")
          col.prop(view, "show_tooltips")
 -        col.prop(view, "show_tooltips_python")
 -        col.prop(view, "show_developer_ui")
          col.prop(view, "show_object_info", text="Object Info")
          col.prop(view, "show_large_cursors")
          col.prop(view, "show_view_name", text="View Name")
          col.prop(view, "show_playback_fps", text="Playback FPS")
 -        col.prop(view, "use_global_scene")
          col.prop(view, "object_origin_size")
  
 -        col.separator()
 -        col.separator()
          col.separator()
  
 -        col.prop(view, "show_mini_axis", text="Display Mini Axis")
 -        sub = col.column()
 -        sub.active = view.show_mini_axis
 +        # col.prop(view, "show_gizmo_navigate")
 +
 +        sub = col.column(align=True)
 +
 +        sub.label("3D Viewport Axis:")
 +        sub.row().prop(view, "mini_axis_type", text="")
 +
 +        sub = col.column(align=True)
 +        sub.active = view.mini_axis_type == 'MINIMAL'
          sub.prop(view, "mini_axis_size", text="Size")
          sub.prop(view, "mini_axis_brightness", text="Brightness")
  
          col.separator()
  
 -        col.label("Warnings")
 -        col.prop(view, "use_quit_dialog")
 +        # Toolbox doesn't exist yet
 +        # col.label(text="Toolbox:")
 +        #col.prop(view, "show_column_layout")
 +        #col.label(text="Open Toolbox Delay:")
 +        #col.prop(view, "open_left_mouse_delay", text="Hold LMB")
 +        #col.prop(view, "open_right_mouse_delay", text="Hold RMB")
 +        col.prop(view, "show_gizmo", text="Gizmos")
 +        sub = col.column()
 +        sub.active = view.show_gizmo
 +        sub.prop(view, "gizmo_size", text="Size")
  
 -        row.separator()
 -        row.separator()
 +        col.separator()
  
 +        col.label("Development:")
 +        col.prop(view, "show_tooltips_python")
 +        col.prop(view, "show_developer_ui")
 +
 +        row = split.row()
 +        row.separator()
          col = row.column()
 -        col.label(text="View Manipulation:")
 +
 +        col.label(text="View Gizmos:")
          col.prop(view, "use_mouse_depth_cursor")
          col.prop(view, "use_cursor_lock_adjust")
          col.prop(view, "use_mouse_depth_navigate")
          col.prop(view, "use_zoom_to_mouse")
          col.prop(view, "use_rotate_around_active")
 -        col.prop(view, "use_global_pivot")
          col.prop(view, "use_camera_lock_parent")
  
          col.separator()
          elif view.view_frame_type == 'KEYFRAMES':
              col.prop(view, "view_frame_keyframes")
  
 +        row = split.row()
          row.separator()
 -        row.separator()
 -
          col = row.column()
 -        # Toolbox doesn't exist yet
 -        # col.label(text="Toolbox:")
 -        #col.prop(view, "show_column_layout")
 -        #col.label(text="Open Toolbox Delay:")
 -        #col.prop(view, "open_left_mouse_delay", text="Hold LMB")
 -        #col.prop(view, "open_right_mouse_delay", text="Hold RMB")
 -        col.prop(view, "show_manipulator")
 -        sub = col.column()
 -        sub.active = view.show_manipulator
 -        sub.prop(view, "manipulator_size", text="Size")
 -        sub.prop(view, "manipulator_handle_size", text="Handle Size")
 -        sub.prop(view, "manipulator_hotspot", text="Hotspot")
 -
 -        col.separator()
 -        col.separator()
 -        col.separator()
  
          col.label(text="Menus:")
          col.prop(view, "use_mouse_over_open")
          col.separator()
  
          col.prop(view, "show_splash")
 +
 +        col.label("Warnings:")
 +        col.prop(view, "use_quit_dialog")
 +
          col.separator()
  
          col.label(text="App Template:")
@@@ -331,10 -342,9 +331,10 @@@ class USERPREF_PT_edit(Panel)
          userpref = context.user_preferences
          edit = userpref.edit
  
 -        row = layout.row()
 -
 +        split = layout.split()
 +        row = split.row()
          col = row.column()
 +
          col.label(text="Link Materials To:")
          col.prop(edit, "material_link", text="")
  
          col.prop(edit, "undo_steps", text="Steps")
          col.prop(edit, "undo_memory_limit", text="Memory Limit")
  
 +        row = split.row()
          row.separator()
 -        row.separator()
 -
          col = row.column()
 -        col.label(text="Grease Pencil:")
 +
 +        col.label(text="Annotations:")
 +        sub = col.row()
 +        sub.prop(edit, "grease_pencil_default_color", text="Default Color")
          col.prop(edit, "grease_pencil_eraser_radius", text="Eraser Radius")
          col.separator()
 +        col.label(text="Grease Pencil/Annotations:")
 +        col.separator()
          col.prop(edit, "grease_pencil_manhattan_distance", text="Manhattan Distance")
          col.prop(edit, "grease_pencil_euclidean_distance", text="Euclidean Distance")
          col.separator()
 -        col.prop(edit, "grease_pencil_default_color", text="Default Color")
 -        col.separator()
          col.prop(edit, "use_grease_pencil_simplify_stroke", text="Simplify Stroke")
          col.separator()
          col.separator()
          col.label(text="Animation Editors:")
          col.prop(edit, "fcurve_unselected_alpha", text="F-Curve Visibility")
  
 +        row = split.row()
          row.separator()
 -        row.separator()
 -
          col = row.column()
 +
          col.label(text="Keyframing:")
          col.prop(edit, "use_visual_keying")
          col.prop(edit, "use_keyframe_insert_needed", text="Only Insert Needed")
  
          col.label(text="Transform:")
          col.prop(edit, "use_drag_immediately")
 +        col.prop(edit, "use_numeric_input_advanced")
  
 +        row = split.row()
          row.separator()
 -        row.separator()
 -
          col = row.column()
 +
          col.prop(edit, "sculpt_paint_overlay_color", text="Sculpt Overlay Color")
  
          col.separator()
          col.prop(edit, "use_duplicate_text", text="Text")
          col.prop(edit, "use_duplicate_metaball", text="Metaball")
          col.prop(edit, "use_duplicate_armature", text="Armature")
 -        col.prop(edit, "use_duplicate_lamp", text="Lamp")
 +        col.prop(edit, "use_duplicate_light", text="Light")
          col.prop(edit, "use_duplicate_material", text="Material")
          col.prop(edit, "use_duplicate_texture", text="Texture")
          #col.prop(edit, "use_duplicate_fcurve", text="F-Curve")
@@@ -470,6 -477,7 +470,6 @@@ class USERPREF_PT_system(Panel)
          col = colsplit.column()
          col.label(text="General:")
  
 -        col.prop(system, "frame_server_port")
          col.prop(system, "scrollback", text="Console Scrollback")
  
          col.separator()
          col = colsplit.column()
          col.label(text="OpenGL:")
          col.prop(system, "gl_clip_alpha", slider=True)
 -        col.prop(system, "use_mipmaps")
          col.prop(system, "use_gpu_mipmap")
          col.prop(system, "use_16bit_textures")
  
          col.separator()
 -        col.label(text="Selection")
 +        col.label(text="Selection:")
          col.prop(system, "select_method", text="")
          col.prop(system, "use_select_pick_depth")
  
          col.separator()
  
 -        col.label(text="Anisotropic Filtering")
 +        col.label(text="Anisotropic Filtering:")
          col.prop(system, "anisotropic_filter", text="")
  
          col.separator()
  
 -        col.label(text="Window Draw Method:")
 -        col.prop(system, "window_draw_method", text="")
          col.prop(system, "multi_sample", text="")
          if sys.platform == "linux" and system.multi_sample != 'NONE':
              col.label(text="Might fail for Mesh editing selection!")
          col.prop(system, "use_region_overlap")
  
          col.separator()
 +        col.prop(system, "gpu_viewport_quality")
 +
 +        col.separator()
 +        col.label(text="Grease Pencil Options:")
 +        col.prop(system, "gpencil_multi_sample", text="")
  
 +        col.separator()
          col.label(text="Text Draw Options:")
-         col.prop(system, "use_text_antialiasing")
-         if system.use_text_antialiasing:
-             col.prop(system, "use_text_hinting")
+         col.prop(system, "use_text_antialiasing", text="Anti-aliasing")
+         sub = col.column()
+         sub.active = system.use_text_antialiasing
+         sub.prop(system, "text_hinting", text="Hinting")
  
 -        col.separator()
 -
 -        col.label(text="Textures:")
 -        col.prop(system, "gl_texture_limit", text="Limit Size")
 -        col.prop(system, "texture_time_out", text="Time Out")
 -        col.prop(system, "texture_collection_rate", text="Collection Rate")
 -
 -        col.separator()
 -
 -        col.label(text="Images Draw Method:")
 -        col.prop(system, "image_draw_method", text="")
 -
 -        col.separator()
 -
 -        col.label(text="Sequencer/Clip Editor:")
 -        # currently disabled in the code
 -        # col.prop(system, "prefetch_frames")
 -        col.prop(system, "memory_cache_limit")
 -
          # 3. Column
          column = split.column()
  
 -        column.label(text="Solid OpenGL Lights:")
 +        column.label(text="Textures:")
 +        column.prop(system, "gl_texture_limit", text="Limit Size")
 +        column.prop(system, "texture_time_out", text="Time Out")
 +        column.prop(system, "texture_collection_rate", text="Collection Rate")
  
 -        split = column.split(percentage=0.1)
 -        split.label()
 -        split.label(text="Colors:")
 -        split.label(text="Direction:")
 +        column.separator()
  
 -        lamp = system.solid_lights[0]
 -        opengl_lamp_buttons(column, lamp)
 +        column.label(text="Images Draw Method:")
 +        column.prop(system, "image_draw_method", text="")
  
 -        lamp = system.solid_lights[1]
 -        opengl_lamp_buttons(column, lamp)
 +        column.separator()
  
 -        lamp = system.solid_lights[2]
 -        opengl_lamp_buttons(column, lamp)
 +        column.label(text="Sequencer/Clip Editor:")
 +        # currently disabled in the code
 +        # column.prop(system, "prefetch_frames")
 +        column.prop(system, "memory_cache_limit")
  
          column.separator()
  
@@@ -697,7 -721,6 +698,7 @@@ class USERPREF_PT_theme(Panel)
          colsub.row().prop(widget_style, "item", slider=True)
          colsub.row().prop(widget_style, "inner", slider=True)
          colsub.row().prop(widget_style, "inner_sel", slider=True)
 +        colsub.row().prop(widget_style, "roundness")
  
          subsplit = row.split(percentage=0.85)
  
              col.label(text="Tool:")
              self._theme_widget_style(col, ui.wcol_tool)
  
 +            col.label(text="Toolbar Item:")
 +            self._theme_widget_style(col, ui.wcol_toolbar_item)
 +
              col.label(text="Radio Buttons:")
              self._theme_widget_style(col, ui.wcol_radio)
  
              col.label(text="List Item:")
              self._theme_widget_style(col, ui.wcol_list_item)
  
 +            col.label(text="Tab:")
 +            self._theme_widget_style(col, ui.wcol_tab)
 +
              ui_state = theme.user_interface.wcol_state
              col.label(text="State:")
  
              colsub.row().prop(ui_state, "inner_anim_sel")
              colsub.row().prop(ui_state, "inner_driven")
              colsub.row().prop(ui_state, "inner_driven_sel")
 +            colsub.row().prop(ui_state, "blend")
  
              subsplit = row.split(percentage=0.85)
  
              colsub = padding.column()
              colsub.row().prop(ui_state, "inner_key")
              colsub.row().prop(ui_state, "inner_key_sel")
 -            colsub.row().prop(ui_state, "blend")
 +            colsub.row().prop(ui_state, "inner_overridden")
 +            colsub.row().prop(ui_state, "inner_overridden_sel")
  
              col.separator()
              col.separator()
              colsub = padding.column()
              colsub = padding.column()
              colsub.row().prop(ui, "menu_shadow_fac")
 -
 -            subsplit = row.split(percentage=0.85)
 -
 -            padding = subsplit.split(percentage=0.15)
 -            colsub = padding.column()
 -            colsub = padding.column()
 -            colsub.row().prop(ui, "menu_shadow_width")
 -
 -            row = col.row()
 -
 -            subsplit = row.split(percentage=0.95)
 -
 -            padding = subsplit.split(percentage=0.15)
 -            colsub = padding.column()
 -            colsub = padding.column()
              colsub.row().prop(ui, "icon_alpha")
 +            colsub.row().prop(ui, "icon_saturation")
 +            colsub.row().prop(ui, "editor_outline")
  
              subsplit = row.split(percentage=0.85)
  
              padding = subsplit.split(percentage=0.15)
              colsub = padding.column()
              colsub = padding.column()
 +            colsub.row().prop(ui, "menu_shadow_width")
              colsub.row().prop(ui, "widget_emboss")
  
              col.separator()
              col.separator()
  
 -            col.label("Axis Colors:")
 +            col.label("Axis & Gizmo Colors:")
  
              row = col.row()
  
              padding = subsplit.split(percentage=0.15)
              colsub = padding.column()
              colsub = padding.column()
 +            colsub.row().prop(ui, "gizmo_primary")
 +            colsub.row().prop(ui, "gizmo_secondary")
 +            colsub.row().prop(ui, "gizmo_a")
 +            colsub.row().prop(ui, "gizmo_b")
  
 -            layout.separator()
 -            layout.separator()
 +            col.separator()
 +            col.separator()
          elif theme.theme_area == 'BONE_COLOR_SETS':
              col = split.column()
  
@@@ -1406,13 -1429,12 +1407,13 @@@ class USERPREF_PT_addons(Panel)
                  continue
  
              # check if addon should be visible with current filters
 -            if ((filter == "All") or
 -                        (filter == info["category"]) or
 -                        (filter == "Enabled" and is_enabled) or
 +            if (
 +                    (filter == "All") or
 +                    (filter == info["category"]) or
 +                    (filter == "Enabled" and is_enabled) or
                      (filter == "Disabled" and not is_enabled) or
                      (filter == "User" and (mod.__file__.startswith((scripts_addons_folder, userpref_addons_folder))))
 -                    ):
 +            ):
                  if search and search not in info["name"].lower():
                      if info["author"]:
                          if search not in info["author"].lower():
                  sub = row.row()
                  sub.active = is_enabled
                  sub.label(text="%s: %s" % (info["category"], info["name"]))
 -                if info["warning"]:
 +
 +                # WARNING: 2.8x exception, may be removed
 +                # use disabled state for old add-ons, chances are they are broken.
 +                if info.get("blender", (0,)) < (2, 80):
 +                    sub.label(text="upgrade to 2.8x required")
 +                    sub.label(icon='ERROR')
 +                # Remove code above after 2.8x migration is complete.
 +                elif info["warning"]:
                      sub.label(icon='ERROR')
  
                  # icon showing support level.
                  row.label(text=module_name, translate=False)
  
  
 +class StudioLightPanelMixin():
 +    bl_space_type = 'USER_PREFERENCES'
 +    bl_region_type = 'WINDOW'
 +
 +    @classmethod
 +    def poll(cls, context):
 +        userpref = context.user_preferences
 +        return (userpref.active_section == 'LIGHTS')
 +
 +    def _get_lights(self, userpref):
 +        return [light for light in userpref.studio_lights if light.is_user_defined and light.orientation == self.sl_orientation]
 +
 +    def draw(self, context):
 +        layout = self.layout
 +        userpref = context.user_preferences
 +        lights = self._get_lights(userpref)
 +        if lights:
 +            flow = layout.column_flow(4)
 +            for studio_light in lights:
 +                self.draw_studio_light(flow, studio_light)
 +        else:
 +            layout.label("No custom {} configured".format(self.bl_label))
 +
 +    def draw_studio_light(self, layout, studio_light):
 +        box = layout.box()
 +        row = box.row()
 +
 +        row.template_icon(layout.icon(studio_light), scale=6.0)
 +        op = row.operator('wm.studiolight_uninstall', text="", icon='ZOOMOUT')
 +        op.index = studio_light.index
 +
 +        box.label(text=studio_light.name)
 +
 +
 +class USERPREF_PT_studiolight_matcaps(Panel, StudioLightPanelMixin):
 +    bl_label = "MatCaps"
 +    sl_orientation = 'MATCAP'
 +
 +
 +class USERPREF_PT_studiolight_world(Panel, StudioLightPanelMixin):
 +    bl_label = "World HDRI"
 +    sl_orientation = 'WORLD'
 +
 +
 +class USERPREF_PT_studiolight_camera(Panel, StudioLightPanelMixin):
 +    bl_label = "Camera HDRI"
 +    sl_orientation = 'CAMERA'
 +
 +
 +class USERPREF_PT_studiolight_specular(Panel, StudioLightPanelMixin):
 +    bl_label = "Specular Lights"
 +    sl_orientation = 'CAMERA'
 +
 +    @classmethod
 +    def poll(cls, context):
 +        userpref = context.user_preferences
 +        return (userpref.active_section == 'LIGHTS')
 +
 +    def opengl_light_buttons(self, column, light):
 +        split = column.split()
 +
 +        col = split.column()
 +        col.prop(light, "use", text="Use", icon='OUTLINER_OB_LIGHT' if light.use else 'LIGHT_DATA')
 +
 +        sub = col.column()
 +        sub.active = light.use
 +        sub.prop(light, "specular_color")
 +
 +        col = split.column()
 +        col.active = light.use
 +        col.prop(light, "direction", text="")
 +
 +    def draw(self, context):
 +        layout = self.layout
 +        column = layout.split()
 +
 +        userpref = context.user_preferences
 +        system = userpref.system
 +
 +        light = system.solid_lights[0]
 +        colsplit = column.split(percentage=0.85)
 +        self.opengl_light_buttons(colsplit, light)
 +
 +        light = system.solid_lights[1]
 +        colsplit = column.split(percentage=0.85)
 +        self.opengl_light_buttons(colsplit, light)
 +
 +        light = system.solid_lights[2]
 +        self.opengl_light_buttons(column, light)
 +
 +
  classes = (
      USERPREF_HT_header,
      USERPREF_PT_tabs,
      USERPREF_PT_input,
      USERPREF_MT_addons_online_resources,
      USERPREF_PT_addons,
 +    USERPREF_PT_studiolight_matcaps,
 +    USERPREF_PT_studiolight_world,
 +    USERPREF_PT_studiolight_camera,
 +    USERPREF_PT_studiolight_specular,
  )
  
  if __name__ == "__main__":  # only for live edit.
index 5a0ade1069eb9da0fc7d69195b284f11e6cd1b8d,0a4212ff2337dae3afcf4e81d215a82c44850823..8a3728574f3876555c2aa27227bbd7ef28f2cb01
@@@ -35,9 -35,6 +35,9 @@@
  #include "BLI_compiler_attrs.h"
  #include "BLI_sys_types.h"
  
 +/* enable this only if needed (unused circa 2016) */
 +#define BLF_BLUR_ENABLE 0
 +
  struct rctf;
  struct ColorManagedDisplay;
  struct ResultBLF;
@@@ -46,8 -43,6 +46,8 @@@ int BLF_init(void)
  void BLF_exit(void);
  void BLF_default_dpi(int dpi);
  void BLF_default_set(int fontid);
 +int BLF_default(void); /* get default font ID so we can pass it to other functions */
 +void BLF_batch_reset(void); /* call when changing opengl context. */
  
  void BLF_cache_clear(void);
  
@@@ -67,17 -62,6 +67,17 @@@ void BLF_aspect(int fontid, float x, fl
  void BLF_position(int fontid, float x, float y, float z);
  void BLF_size(int fontid, int size, int dpi);
  
 +/* goal: small but useful color API */
 +void BLF_color4ubv(int fontid, const unsigned char rgba[4]);
 +void BLF_color3ubv(int fontid, const unsigned char rgb[3]);
 +void BLF_color3ubv_alpha(int fontid, const unsigned char rgb[3], unsigned char alpha);
 +void BLF_color3ub(int fontid, unsigned char r, unsigned char g, unsigned char b);
 +void BLF_color4f(int fontid, float r, float g, float b, float a);
 +void BLF_color4fv(int fontid, const float rgba[4]);
 +void BLF_color3f(int fontid, float r, float g, float b);
 +void BLF_color3fv_alpha(int fontid, const float rgb[3], float alpha);
 +/* also available: UI_FontThemeColor(fontid, colorid) */
 +
  /* Set a 4x4 matrix to be multiplied before draw the text.
   * Remember that you need call BLF_enable(BLF_MATRIX)
   * to enable this.
   */
  void BLF_matrix(int fontid, const float m[16]);
  
 +/* Batch drawcalls together as long as
 + * the modelview matrix and the font remain unchanged. */
 +void BLF_batch_draw_begin(void);
 +void BLF_batch_draw_flush(void);
 +void BLF_batch_draw_end(void);
 +
  /* Draw the string using the default font, size and dpi. */
  void BLF_draw_default(float x, float y, float z, const char *str, size_t len) ATTR_NONNULL();
  void BLF_draw_default_ascii(float x, float y, float z, const char *str, size_t len) ATTR_NONNULL();
  
 +/* Set size and DPI, and return default font ID. */
 +int BLF_set_default(void);
 +
  /* Draw the string using the current font. */
  void BLF_draw_ex(int fontid, const char *str, size_t len, struct ResultBLF *r_info) ATTR_NONNULL(2);
  void BLF_draw(int fontid, const char *str, size_t len) ATTR_NONNULL(2);
@@@ -148,16 -123,29 +148,16 @@@ void BLF_width_and_height(int fontid, c
   */
  float BLF_fixed_width(int fontid) ATTR_WARN_UNUSED_RESULT;
  
 -/* and this two function return the width and height
 - * of the string, using the default font and both value
 - * are multiplied by the aspect of the font.
 - */
 -void  BLF_width_and_height_default(const char *str, size_t len, float *r_width, float *r_height) ATTR_NONNULL();
 -float BLF_width_default(const char *str, size_t len) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
 -float BLF_height_default(const char *str, size_t len) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
 -
 -/* Set rotation for default font. */
 -void BLF_rotation_default(float angle);
 -
 -/* Enable/disable options to the default font. */
 -void BLF_enable_default(int option);
 -void BLF_disable_default(int option);
 -
  /* By default, rotation and clipping are disable and
   * have to be enable/disable using BLF_enable/disable.
   */
  void BLF_rotation(int fontid, float angle);
  void BLF_clipping(int fontid, float xmin, float ymin, float xmax, float ymax);
 -void BLF_clipping_default(float xmin, float ymin, float xmax, float ymax);
  void BLF_wordwrap(int fontid, int wrap_width);
 +
 +#if BLF_BLUR_ENABLE
  void BLF_blur(int fontid, int size);
 +#endif
  
  void BLF_enable(int fontid, int option);
  void BLF_disable(int fontid, int option);
@@@ -230,9 -218,11 +230,11 @@@ void BLF_state_print(int fontid)
  #define BLF_KERNING_DEFAULT  (1 << 3)
  #define BLF_MATRIX           (1 << 4)
  #define BLF_ASPECT           (1 << 5)
- #define BLF_HINTING          (1 << 6)
- #define BLF_WORD_WRAP        (1 << 7)
- #define BLF_MONOCHROME       (1 << 8)  /* no-AA */
+ #define BLF_WORD_WRAP        (1 << 6)
+ #define BLF_MONOCHROME       (1 << 7)  /* no-AA */
+ #define BLF_HINTING_NONE     (1 << 8)
+ #define BLF_HINTING_SLIGHT   (1 << 9)
+ #define BLF_HINTING_FULL     (1 << 10)
  
  #define BLF_DRAW_STR_DUMMY_MAX 1024
  
index 5b1a382e36890904779a7312804c4370130737a9,c19c85282325dfcb2bc3ea28e2437fca73e75d81..2679deea254993a7c8b7d358eb7857d257ee52c8
  #include "BLF_api.h"
  
  #ifndef BLF_STANDALONE
 -#  include "GPU_basic_shader.h"
 +#  include "GPU_immediate.h"
 +#  include "GPU_extensions.h"
  #endif
  
  #include "blf_internal_types.h"
  #include "blf_internal.h"
  
  #include "BLI_strict_flags.h"
 +#include "BLI_math_vector.h"
 +
 +KerningCacheBLF *blf_kerning_cache_find(FontBLF *font)
 +{
 +      KerningCacheBLF *p;
 +
 +      p = (KerningCacheBLF *)font->kerning_caches.first;
 +      while (p) {
 +              if (p->mode == font->kerning_mode)
 +                      return p;
 +              p = p->next;
 +      }
 +      return NULL;
 +}
 +
 +/* Create a new glyph cache for the current kerning mode. */
 +KerningCacheBLF *blf_kerning_cache_new(FontBLF *font)
 +{
 +      KerningCacheBLF *kc;
 +
 +      kc = (KerningCacheBLF *)MEM_callocN(sizeof(KerningCacheBLF), "blf_kerning_cache_new");
 +      kc->next = NULL;
 +      kc->prev = NULL;
 +      kc->mode = font->kerning_mode;
 +
 +      unsigned int i, j;
 +      for (i = 0; i < 0x80; i++) {
 +              for (j = 0; j < 0x80; j++) {
 +                      GlyphBLF *g = blf_glyph_search(font->glyph_cache, i);
 +                      if (!g) {
 +                              FT_UInt glyph_index = FT_Get_Char_Index(font->face, i);
 +                              g = blf_glyph_add(font, glyph_index, i);
 +                      }
 +                      /* Cannot fail since it has been added just before. */
 +                      GlyphBLF *g_prev = blf_glyph_search(font->glyph_cache, j);
 +
 +                      FT_Vector delta = {.x = 0, .y = 0};
 +                      if (FT_Get_Kerning(font->face, g_prev->idx, g->idx, kc->mode, &delta) == 0) {
 +                              kc->table[i][j] = (int)delta.x >> 6;
 +                      }
 +                      else {
 +                              kc->table[i][j] = 0;
 +                      }
 +              }
 +      }
 +
 +      BLI_addhead(&font->kerning_caches, kc);
 +      return kc;
 +}
 +
 +void blf_kerning_cache_clear(FontBLF *font)
 +{
 +      font->kerning_cache = NULL;
 +      BLI_freelistN(&font->kerning_caches);
 +}
  
  GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, unsigned int size, unsigned int dpi)
  {
@@@ -147,12 -91,12 +147,12 @@@ GlyphCacheBLF *blf_glyph_cache_new(Font
        memset(gc->glyph_ascii_table, 0, sizeof(gc->glyph_ascii_table));
        memset(gc->bucket, 0, sizeof(gc->bucket));
  
 -      gc->textures = (GLuint *)MEM_mallocN(sizeof(GLuint) * 256, __func__);
 +      gc->textures = (GPUTexture **)MEM_callocN(sizeof(GPUTexture *) * 256, __func__);
        gc->textures_len = 256;
        gc->texture_current = BLF_TEXTURE_UNSET;
 -      gc->offset_x = 0;
 -      gc->offset_y = 0;
 -      gc->pad = 3;
 +      gc->offset_x = 3; /* enough padding for blur */
 +      gc->offset_y = 3; /* enough padding for blur */
 +      gc->pad = 6;
  
        gc->glyphs_len_max = (int)font->face->num_glyphs;
        gc->glyphs_len_free = (int)font->face->num_glyphs;
@@@ -197,17 -141,16 +197,17 @@@ void blf_glyph_cache_clear(FontBLF *fon
  void blf_glyph_cache_free(GlyphCacheBLF *gc)
  {
        GlyphBLF *g;
 -      int i;
 +      unsigned int i;
  
        for (i = 0; i < 257; i++) {
                while ((g = BLI_pophead(&gc->bucket[i]))) {
                        blf_glyph_free(g);
                }
        }
 -
 -      if (gc->texture_current != BLF_TEXTURE_UNSET) {
 -              glDeleteTextures((int)gc->texture_current + 1, gc->textures);
 +      for (i = 0; i < gc->textures_len; i++) {
 +              if (gc->textures[i]) {
 +                      GPU_texture_free(gc->textures[i]);
 +              }
        }
        MEM_freeN(gc->textures);
        MEM_freeN(gc);
  static void blf_glyph_cache_texture(FontBLF *font, GlyphCacheBLF *gc)
  {
        int i;
 +      char error[256];
  
        /* move the index. */
        gc->texture_current++;
  
        if (UNLIKELY(gc->texture_current >= gc->textures_len)) {
                gc->textures_len *= 2;
 -              gc->textures = MEM_reallocN((void *)gc->textures, sizeof(GLuint) * gc->textures_len);
 +              gc->textures = MEM_recallocN((void *)gc->textures, sizeof(GPUTexture *) * gc->textures_len);
        }
  
        gc->p2_width = (int)blf_next_p2((unsigned int)((gc->glyphs_len_free * gc->glyph_width_max) + (gc->pad * 2)));
        }
  
        i = (int)((gc->p2_width - (gc->pad * 2)) / gc->glyph_width_max);
 -      gc->p2_height = (int)blf_next_p2((unsigned int)(((gc->glyphs_len_max / i) + 1) * gc->glyph_height_max));
 +      gc->p2_height = (int)blf_next_p2((unsigned int)(((gc->glyphs_len_max / i) + 1) * gc->glyph_height_max + (gc->pad * 2)));
  
        if (gc->p2_height > font->tex_size_max) {
                gc->p2_height = font->tex_size_max;
        }
  
 -      glGenTextures(1, &gc->textures[gc->texture_current]);
 -      glBindTexture(GL_TEXTURE_2D, (font->tex_bind_state = gc->textures[gc->texture_current]));
 -      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 -      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 -      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 -      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 -
 -#ifndef BLF_STANDALONE
 -      /* needed since basic shader doesn't support alpha-only textures,
 -       * while we could add support this is only used in a few places
 -       * (an alternative could be to have a simple shader for BLF). */
 -      if (GLEW_ARB_texture_swizzle && GPU_basic_shader_use_glsl_get()) {
 -              GLint swizzle_mask[] = {GL_ONE, GL_ONE, GL_ONE, GL_ALPHA};
 -              glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_mask);
 -      }
 -#endif
 -
 -      glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA8, gc->p2_width, gc->p2_height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, NULL);
 +      unsigned char *pixels = MEM_callocN((size_t)gc->p2_width * (size_t)gc->p2_height, "BLF texture init");
 +      GPUTexture *tex = GPU_texture_create_nD(gc->p2_width, gc->p2_height, 0, 2, pixels, GPU_R8, GPU_DATA_UNSIGNED_BYTE, 0, false, error);
 +      MEM_freeN(pixels);
 +      gc->textures[gc->texture_current] = tex;
 +      GPU_texture_bind(tex, 0);
 +      GPU_texture_wrap_mode(tex, false);
 +      GPU_texture_filters(tex, GPU_NEAREST, GPU_LINEAR);
 +      GPU_texture_unbind(tex);
  }
  
  GlyphBLF *blf_glyph_search(GlyphCacheBLF *gc, unsigned int c)
@@@ -269,7 -221,6 +269,6 @@@ GlyphBLF *blf_glyph_add(FontBLF *font, 
        GlyphBLF *g;
        FT_Error err;
        FT_Bitmap bitmap, tempbitmap;
-       int flags = FT_LOAD_TARGET_NORMAL | FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP;
        FT_BBox bbox;
        unsigned int key;
  
                return g;
        }
  
-       if (font->flags & BLF_HINTING)
-               flags &= ~FT_LOAD_NO_HINTING;
        if (font->flags & BLF_MONOCHROME) {
                err = FT_Load_Glyph(font->face, (FT_UInt)index, FT_LOAD_TARGET_MONO);
        }
        else {
+               int flags = FT_LOAD_NO_BITMAP;
+               if (font->flags & BLF_HINTING_NONE) {
+                       flags |= FT_LOAD_TARGET_NORMAL | FT_LOAD_NO_HINTING;
+               }
+               else if (font->flags & BLF_HINTING_SLIGHT) {
+                       flags |= FT_LOAD_TARGET_LIGHT;
+               }
+               else if (font->flags & BLF_HINTING_FULL) {
+                       flags |= FT_LOAD_TARGET_NORMAL;
+               }
+               else {
+                       /* Default, hinting disabled until FreeType has been upgraded
+                        * to give good results on all platforms. */
+                       flags |= FT_LOAD_TARGET_NORMAL | FT_LOAD_NO_HINTING;
+               }
                err = FT_Load_Glyph(font->face, (FT_UInt)index, flags);
        }
  
                        }
                }
  
 -              g->bitmap = (unsigned char *)MEM_mallocN((size_t)(g->width * g->height), "glyph bitmap");
 -              memcpy((void *)g->bitmap, (void *)bitmap.buffer, (size_t)(g->width * g->height));
 +              g->bitmap = (unsigned char *)MEM_mallocN((size_t)g->width * (size_t)g->height, "glyph bitmap");
 +              memcpy((void *)g->bitmap, (void *)bitmap.buffer, (size_t)g->width * (size_t)g->height);
        }
  
        g->advance = ((float)slot->advance.x) / 64.0f;
@@@ -374,62 -339,87 +387,62 @@@ void blf_glyph_free(GlyphBLF *g
        /* don't need free the texture, the GlyphCache already
         * have a list of all the texture and free it.
         */
 -      if (g->bitmap) {
 +      if (g->bitmap)
                MEM_freeN(g->bitmap);
 -      }
        MEM_freeN(g);
  }
  
 -static void blf_texture_draw(float uv[2][2], float dx, float y1, float dx1, float y2)
 +static void blf_texture_draw(const unsigned char color[4], const float uv[2][2], float x1, float y1, float x2, float y2)
  {
 -      glBegin(GL_QUADS);
 -      glTexCoord2f(uv[0][0], uv[0][1]);
 -      glVertex2f(dx, y1);
 -
 -      glTexCoord2f(uv[0][0], uv[1][1]);
 -      glVertex2f(dx, y2);
 -
 -      glTexCoord2f(uv[1][0], uv[1][1]);
 -      glVertex2f(dx1, y2);
 -
 -      glTexCoord2f(uv[1][0], uv[0][1]);
 -      glVertex2f(dx1, y1);
 -      glEnd();
 +      /* Only one vertex per glyph, geometry shader expand it into a quad. */
 +      /* TODO Get rid of Geom Shader because it's not optimal AT ALL for the GPU */
 +      copy_v4_fl4(GPU_vertbuf_raw_step(&g_batch.pos_step), x1 + g_batch.ofs[0], y1 + g_batch.ofs[1],
 +                                                           x2 + g_batch.ofs[0], y2 + g_batch.ofs[1]);
 +      copy_v4_v4(GPU_vertbuf_raw_step(&g_batch.tex_step), (float *)uv);
 +      copy_v4_v4_uchar(GPU_vertbuf_raw_step(&g_batch.col_step), color);
 +      g_batch.glyph_len++;
 +      /* Flush cache if it's full. */
 +      if (g_batch.glyph_len == BLF_BATCH_DRAW_LEN_MAX) {
 +              blf_batch_draw();
 +      }
  }
  
 -static void blf_texture5_draw(const float shadow_col[4], float uv[2][2], float x1, float y1, float x2, float y2)
 +static void blf_texture5_draw(const unsigned char color_in[4], int tex_w, int tex_h, const float uv[2][2],
 +                              float x1, float y1, float x2, float y2)
  {
 -      const float soft[25] = {1 / 60.0f, 1 / 60.0f, 2 / 60.0f, 1 / 60.0f, 1 / 60.0f,
 -                              1 / 60.0f, 3 / 60.0f, 5 / 60.0f, 3 / 60.0f, 1 / 60.0f,
 -                              2 / 60.0f, 5 / 60.0f, 8 / 60.0f, 5 / 60.0f, 2 / 60.0f,
 -                              1 / 60.0f, 3 / 60.0f, 5 / 60.0f, 3 / 60.0f, 1 / 60.0f,
 -                              1 / 60.0f, 1 / 60.0f, 2 / 60.0f, 1 / 60.0f, 1 / 60.0f};
 -
 -      const float *fp = soft;
 -      float color[4];
 -      float dx, dy;
 -
 -      color[0] = shadow_col[0];
 -      color[1] = shadow_col[1];
 -      color[2] = shadow_col[2];
 -
 -      for (dx = -2; dx < 3; dx++) {
 -              for (dy = -2; dy < 3; dy++, fp++) {
 -                      color[3] = *(fp) * shadow_col[3];
 -                      glColor4fv(color);
 -                      blf_texture_draw(uv, x1 + dx, y1 + dy, x2 + dx, y2 + dy);
 -              }
 -      }
 -
 -      glColor4fv(color);
 +      float ofs[2] = { 2 / (float)tex_w, 2 / (float)tex_h };
 +      float uv_flag[2][2];
 +      copy_v4_v4((float *)uv_flag, (float *)uv);
 +      /* flag the x and y component signs for 5x5 bluring */
 +      uv_flag[0][0] = -(uv_flag[0][0] - ofs[0]);
 +      uv_flag[0][1] = -(uv_flag[0][1] - ofs[1]);
 +      uv_flag[1][0] = -(uv_flag[1][0] + ofs[0]);
 +      uv_flag[1][1] = -(uv_flag[1][1] + ofs[1]);
 +
 +      blf_texture_draw(color_in, uv_flag, x1 - 2, y1 + 2, x2 + 2, y2 - 2);
  }
  
 -static void blf_texture3_draw(const float shadow_col[4], float uv[2][2], float x1, float y1, float x2, float y2)
 +static void blf_texture3_draw(const unsigned char color_in[4], int tex_w, int tex_h, const float uv[2][2],
 +                              float x1, float y1, float x2, float y2)
  {
 -      const float soft[9] = {1 / 16.0f, 2 / 16.0f, 1 / 16.0f,
 -                             2 / 16.0f, 4 / 16.0f, 2 / 16.0f,
 -                             1 / 16.0f, 2 / 16.0f, 1 / 16.0f};
 -
 -      const float *fp = soft;
 -      float color[4];
 -      float dx, dy;
 -
 -      color[0] = shadow_col[0];
 -      color[1] = shadow_col[1];
 -      color[2] = shadow_col[2];
 -
 -      for (dx = -1; dx < 2; dx++) {
 -              for (dy = -1; dy < 2; dy++, fp++) {
 -                      color[3] = *(fp) * shadow_col[3];
 -                      glColor4fv(color);
 -                      blf_texture_draw(uv, x1 + dx, y1 + dy, x2 + dx, y2 + dy);
 -              }
 -      }
 -
 -      glColor4fv(color);
 +      float ofs[2] = { 1 / (float)tex_w, 1 / (float)tex_h };
 +      float uv_flag[2][2];
 +      copy_v4_v4((float *)uv_flag, (float *)uv);
 +      /* flag the x component sign for 3x3 bluring */
 +      uv_flag[0][0] = -(uv_flag[0][0] - ofs[0]);
 +      uv_flag[0][1] =  (uv_flag[0][1] - ofs[1]);
 +      uv_flag[1][0] = -(uv_flag[1][0] + ofs[0]);
 +      uv_flag[1][1] =  (uv_flag[1][1] + ofs[1]);
 +
 +      blf_texture_draw(color_in, uv_flag, x1 - 1, y1 + 1, x2 + 1, y2 - 1);
  }
  
  static void blf_glyph_calc_rect(rctf *rect, GlyphBLF *g, float x, float y)
  {
        rect->xmin = floorf(x + g->pos_x);
        rect->xmax = rect->xmin + (float)g->width;
 -      rect->ymin = y + g->pos_y;
 -      rect->ymax = y + g->pos_y - (float)g->height;
 +      rect->ymin = floorf(y + g->pos_y);
 +      rect->ymax = rect->ymin - (float)g->height;
  }
  
  void blf_glyph_render(FontBLF *font, GlyphBLF *g, float x, float y)
                GlyphCacheBLF *gc = font->glyph_cache;
  
                if (font->tex_size_max == -1)
 -                      glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint *)&font->tex_size_max);
 +                      font->tex_size_max = GPU_max_texture_size();
  
                if (gc->texture_current == BLF_TEXTURE_UNSET) {
                        blf_glyph_cache_texture(font, gc);
                        gc->offset_x = gc->pad;
 -                      gc->offset_y = 0;
 +                      gc->offset_y = 3; /* enough padding for blur */
                }
  
                if (gc->offset_x > (gc->p2_width - gc->glyph_width_max)) {
                        gc->offset_y += gc->glyph_height_max;
  
                        if (gc->offset_y > (gc->p2_height - gc->glyph_height_max)) {
 -                              gc->offset_y = 0;
 +                              gc->offset_y = 3; /* enough padding for blur */
                                blf_glyph_cache_texture(font, gc);
                        }
                }
                        BLI_assert(g->height > 0);
                }
  
 -
 -              glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
 -              glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
 -              glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
 -              glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 -
 -              glBindTexture(GL_TEXTURE_2D, g->tex);
 -              glTexSubImage2D(GL_TEXTURE_2D, 0, g->offset_x, g->offset_y, g->width, g->height, GL_ALPHA, GL_UNSIGNED_BYTE, g->bitmap);
 -              glPopClientAttrib();
 +              GPU_texture_update_sub(g->tex, GPU_DATA_UNSIGNED_BYTE, g->bitmap, g->offset_x, g->offset_y, 0, g->width, g->height, 0);
  
                g->uv[0][0] = ((float)g->offset_x) / ((float)gc->p2_width);
                g->uv[0][1] = ((float)g->offset_y) / ((float)gc->p2_height);
        }
  
        if (font->tex_bind_state != g->tex) {
 -              glBindTexture(GL_TEXTURE_2D, (font->tex_bind_state = g->tex));
 +              blf_batch_draw();
 +              font->tex_bind_state = g->tex;
 +              GPU_texture_bind(font->tex_bind_state, 0);
        }
  
 +      g_batch.tex_bind_state = g->tex;
 +
        if (font->flags & BLF_SHADOW) {
                rctf rect_ofs;
                blf_glyph_calc_rect(&rect_ofs, g,
                                    x + (float)font->shadow_x,
                                    y + (float)font->shadow_y);
  
 -              switch (font->shadow) {
 -                      case 3:
 -                              blf_texture3_draw(font->shadow_col, g->uv, rect_ofs.xmin, rect_ofs.ymin, rect_ofs.xmax, rect_ofs.ymax);
 -                              break;
 -                      case 5:
 -                              blf_texture5_draw(font->shadow_col, g->uv, rect_ofs.xmin, rect_ofs.ymin, rect_ofs.xmax, rect_ofs.ymax);
 -                              break;
 -                      default:
 -                              glColor4fv(font->shadow_col);
 -                              blf_texture_draw(g->uv, rect_ofs.xmin, rect_ofs.ymin, rect_ofs.xmax, rect_ofs.ymax);
 -                              break;
 +              if (font->shadow == 0) {
 +                      blf_texture_draw(font->shadow_color, g->uv, rect_ofs.xmin, rect_ofs.ymin, rect_ofs.xmax, rect_ofs.ymax);
 +              }
 +              else if (font->shadow <= 4) {
 +                      blf_texture3_draw(font->shadow_color, font->glyph_cache->p2_width, font->glyph_cache->p2_height, g->uv,
 +                                        rect_ofs.xmin, rect_ofs.ymin, rect_ofs.xmax, rect_ofs.ymax);
 +              }
 +              else {
 +                      blf_texture5_draw(font->shadow_color, font->glyph_cache->p2_width, font->glyph_cache->p2_height, g->uv,
 +                                        rect_ofs.xmin, rect_ofs.ymin, rect_ofs.xmax, rect_ofs.ymax);
                }
 -
 -              glColor4fv(font->orig_col);
        }
  
 +#if BLF_BLUR_ENABLE
        switch (font->blur) {
                case 3:
 -                      blf_texture3_draw(font->orig_col, g->uv, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
 +                      blf_texture3_draw(font->color, font->glyph_cache->p2_width, font->glyph_cache->p2_height, g->uv,
 +                                        rect.xmin, rect.ymin, rect.xmax, rect.ymax);
                        break;
                case 5:
 -                      blf_texture5_draw(font->orig_col, g->uv, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
 +                      blf_texture5_draw(font->color, font->glyph_cache->p2_width, font->glyph_cache->p2_height, g->uv,
 +                                        rect.xmin, rect.ymin, rect.xmax, rect.ymax);
                        break;
                default:
 -                      blf_texture_draw(g->uv, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
 -                      break;
 +                      blf_texture_draw(font->color, g->uv, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
        }
 -
 -      return;
 +#else
 +      blf_texture_draw(font->color, g->uv, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
 +#endif
  }
index ed4c766c59644f1c153b8eb1727cb6ad38b8540c,c7ecc37b0bf29b21132de202a44285713b35bfd7..16c3e01e7aa1ed6f6c6703eb6844f2af7818419b
@@@ -149,7 -149,7 +149,7 @@@ static uiFont *uifont_to_blfont(int id
  
  
  void UI_fontstyle_draw_ex(
 -        const uiFontStyle *fs, const rcti *rect, const char *str,
 +        const uiFontStyle *fs, const rcti *rect, const char *str, const unsigned char col[4],
          size_t len, float *r_xofs, float *r_yofs)
  {
        int xofs = 0, yofs;
        /* clip is very strict, so we give it some space */
        BLF_clipping(fs->uifont_id, rect->xmin - 2, rect->ymin - 4, rect->xmax + 1, rect->ymax + 4);
        BLF_position(fs->uifont_id, rect->xmin + xofs, rect->ymin + yofs, 0.0f);
 +      BLF_color4ubv(fs->uifont_id, col);
  
        BLF_draw(fs->uifont_id, str, len);
  
        *r_yofs = yofs;
  }
  
 -void UI_fontstyle_draw(const uiFontStyle *fs, const rcti *rect, const char *str)
 +void UI_fontstyle_draw(const uiFontStyle *fs, const rcti *rect, const char *str, const unsigned char col[4])
  {
        float xofs, yofs;
  
        UI_fontstyle_draw_ex(
 -              fs, rect, str,
 +              fs, rect, str, col,
                BLF_DRAW_STR_DUMMY_MAX, &xofs, &yofs);
  }
  
  /* drawn same as above, but at 90 degree angle */
 -void UI_fontstyle_draw_rotated(const uiFontStyle *fs, const rcti *rect, const char *str)
 +void UI_fontstyle_draw_rotated(const uiFontStyle *fs, const rcti *rect, const char *str, const unsigned char col[4])
  {
        float height;
        int xofs, yofs;
  
        BLF_enable(fs->uifont_id, BLF_ROTATION);
        BLF_rotation(fs->uifont_id, angle);
 +      BLF_color4ubv(fs->uifont_id, col);
  
        if (fs->shadow) {
                BLF_enable(fs->uifont_id, BLF_SHADOW);
   *
   * For drawing on-screen labels.
   */
 -void UI_fontstyle_draw_simple(const uiFontStyle *fs, float x, float y, const char *str)
 +void UI_fontstyle_draw_simple(const uiFontStyle *fs, float x, float y, const char *str, const unsigned char col[4])
  {
        if (fs->kerning == 1)
                BLF_enable(fs->uifont_id, BLF_KERNING_DEFAULT);
  
        UI_fontstyle_set(fs);
        BLF_position(fs->uifont_id, x, y, 0.0f);
 +      BLF_color4ubv(fs->uifont_id, col);
        BLF_draw(fs->uifont_id, str, BLF_DRAW_STR_DUMMY_MAX);
  
        if (fs->kerning == 1)
   */
  void UI_fontstyle_draw_simple_backdrop(
          const uiFontStyle *fs, float x, float y, const char *str,
 -        const unsigned char fg[4], const unsigned char bg[4])
 +        const float col_fg[4], const float col_bg[4])
  {
        if (fs->kerning == 1)
                BLF_enable(fs->uifont_id, BLF_KERNING_DEFAULT);
                const float margin = height / 4.0f;
  
                /* backdrop */
 -              glColor4ubv(bg);
 +              float color[4] = { col_bg[0], col_bg[1], col_bg[2], 0.5f };
  
 -              UI_draw_roundbox_corner_set(UI_CNR_ALL | UI_RB_ALPHA);
 -              UI_draw_roundbox(
 +              UI_draw_roundbox_corner_set(UI_CNR_ALL);
 +              UI_draw_roundbox_aa(true,
                        x - margin,
                        (y + decent) - margin,
                        x + width + margin,
                        (y + decent) + height + margin,
 -                      margin);
 -
 -              glColor4ubv(fg);
 +                      margin, color);
        }
  
 -
        BLF_position(fs->uifont_id, x, y, 0.0f);
 +      BLF_color4fv(fs->uifont_id, col_fg);
        BLF_draw(fs->uifont_id, str, BLF_DRAW_STR_DUMMY_MAX);
  
        if (fs->kerning == 1)
@@@ -524,30 -523,35 +524,35 @@@ void uiStyleInit(void
  
        /* Set default flags based on UI preferences (not render fonts) */
        {
-               int flag_enable = 0, flag_disable = 0;
-               if ((U.text_render & USER_TEXT_DISABLE_HINTING) == 0) {
-                       flag_enable |= BLF_HINTING;
+               int flag_disable = BLF_MONOCHROME |
+                                  BLF_HINTING_NONE |
+                                  BLF_HINTING_SLIGHT |
+                                  BLF_HINTING_FULL;
+               int flag_enable = 0;
+               if (U.text_render & USER_TEXT_HINTING_NONE) {
+                       flag_enable |= BLF_HINTING_NONE;
                }
-               else {
-                       flag_disable |= BLF_HINTING;
+               else if (U.text_render & USER_TEXT_HINTING_SLIGHT) {
+                       flag_enable |= BLF_HINTING_SLIGHT;
+               }
+               else if (U.text_render & USER_TEXT_HINTING_FULL) {
+                       flag_enable |= BLF_HINTING_FULL;
                }
  
                if (U.text_render & USER_TEXT_DISABLE_AA) {
                        flag_enable |= BLF_MONOCHROME;
                }
-               else {
-                       flag_disable |= BLF_MONOCHROME;
-               }
  
                for (font = U.uifonts.first; font; font = font->next) {
                        if (font->blf_id != -1) {
-                               BLF_enable(font->blf_id, flag_enable);
                                BLF_disable(font->blf_id, flag_disable);
+                               BLF_enable(font->blf_id, flag_enable);
                        }
                }
                if (blf_mono_font != -1) {
-                       BLF_enable(blf_mono_font, flag_enable);
                        BLF_disable(blf_mono_font, flag_disable);
+                       BLF_enable(blf_mono_font, flag_enable);
                }
        }
  
index cb2c69e2fa11f83053d90548d7d1dfe88581453e,f78b48b2d25db7a958ad626ebc54ee33acd13fe5..362a923255397996233648541a84271091387247
@@@ -48,11 -48,6 +48,11 @@@ struct ColorBand
  
  #define MAX_STYLE_NAME        64
  
 +#define GPU_VIEWPORT_QUALITY_FXAA 0.10f
 +#define GPU_VIEWPORT_QUALITY_TAA8 0.25f
 +#define GPU_VIEWPORT_QUALITY_TAA16 0.6f
 +#define GPU_VIEWPORT_QUALITY_TAA32 0.8f
 +
  /* default offered by Blender.
   * uiFont.uifont_id */
  typedef enum eUIFont_ID {
@@@ -72,7 -67,7 +72,7 @@@ typedef struct uiFont 
        short blf_id;           /* from blfont lib */
        short uifont_id;        /* own id (eUIFont_ID) */
        short r_to_l;           /* fonts that read from left to right */
-       short hinting;
+       short pad;
  } uiFont;
  
  /* this state defines appearance of text */
@@@ -136,8 -131,6 +136,8 @@@ typedef struct uiWidgetColors 
        short shaded;
        short shadetop, shadedown;
        short alpha_check;
 +      float roundness;
 +      float pad;
  } uiWidgetColors;
  
  typedef struct uiWidgetStateColors {
        char inner_key_sel[4];
        char inner_driven[4];
        char inner_driven_sel[4];
 +      char inner_overridden[4];
 +      char inner_overridden_sel[4];
        float blend, pad;
  } uiWidgetStateColors;
  
  typedef struct uiPanelColors {
        char header[4];
        char back[4];
 -      short show_header;
 -      short show_back;
 -      int pad;
 +      char sub_back[4];
 +      char pad2[4];
  } uiPanelColors;
  
  typedef struct uiGradientColors {
  
  typedef struct ThemeUI {
        /* Interface Elements (buttons, menus, icons) */
 -      uiWidgetColors wcol_regular, wcol_tool, wcol_text;
 +      uiWidgetColors wcol_regular, wcol_tool, wcol_toolbar_item, wcol_text;
        uiWidgetColors wcol_radio, wcol_option, wcol_toggle;
 -      uiWidgetColors wcol_num, wcol_numslider;
 +      uiWidgetColors wcol_num, wcol_numslider, wcol_tab;
        uiWidgetColors wcol_menu, wcol_pulldown, wcol_menu_back, wcol_menu_item, wcol_tooltip;
        uiWidgetColors wcol_box, wcol_scroll, wcol_progress, wcol_list_item, wcol_pie_menu;
  
        float menu_shadow_fac;
        short menu_shadow_width;
  
 -      short pad[3];
 +      char editor_outline[4];
 +      short pad[1];
  
        char iconfile[256];     // FILE_MAXFILE length
        float icon_alpha;
 +      float icon_saturation;
 +      char _pad[4];
  
        /* Axis Colors */
        char xaxis[4], yaxis[4], zaxis[4];
 +
 +      /* Gizmo Colors. */
 +      char gizmo_hi[4];
 +      char gizmo_primary[4];
 +      char gizmo_secondary[4];
 +      char gizmo_a[4];
 +      char gizmo_b[4];
 +      char pad2[4];
  } ThemeUI;
  
  /* try to put them all in one, if needed a special struct can be created as well
@@@ -406,11 -387,10 +406,11 @@@ typedef struct bTheme 
        ThemeSpace toops;
        ThemeSpace ttime;
        ThemeSpace tnode;
 -      ThemeSpace tlogic;
        ThemeSpace tuserpref;
        ThemeSpace tconsole;
        ThemeSpace tclip;
 +      ThemeSpace ttopbar;
 +      ThemeSpace tstatusbar;
  
        /* 20 sets of bone colors for this theme */
        ThemeWireColor tarm[20];
@@@ -434,51 -414,6 +434,51 @@@ typedef struct bPathCompare 
        char flag, pad[7];
  } bPathCompare;
  
 +typedef struct bUserMenu {
 +      struct bUserMenu *next, *prev;
 +      char space_type;
 +      char _pad0[7];
 +      char context[64];
 +      /* bUserMenuItem */
 +      ListBase items;
 +} bUserMenu;
 +
 +/* May be part of bUserMenu or other list. */
 +typedef struct bUserMenuItem {
 +      struct bUserMenuItem *next, *prev;
 +      char ui_name[64];
 +      char type;
 +      char _pad0[7];
 +} bUserMenuItem;
 +
 +typedef struct bUserMenuItem_Op {
 +      bUserMenuItem item;
 +      char op_idname[64];
 +      struct IDProperty *prop;
 +      char opcontext;
 +      char _pad0[7];
 +} bUserMenuItem_Op;
 +
 +typedef struct bUserMenuItem_Menu {
 +      bUserMenuItem item;
 +      char mt_idname[64];
 +} bUserMenuItem_Menu;
 +
 +typedef struct bUserMenuItem_Prop {
 +      bUserMenuItem item;
 +      char context_data_path[256];
 +      char prop_id[64];
 +      int  prop_index;
 +      char _pad0[4];
 +} bUserMenuItem_Prop;
 +
 +enum {
 +      USER_MENU_TYPE_SEP = 1,
 +      USER_MENU_TYPE_OPERATOR = 2,
 +      USER_MENU_TYPE_MENU = 3,
 +      USER_MENU_TYPE_PROP = 4,
 +};
 +
  typedef struct SolidLight {
        int flag, pad;
        float col[4], spec[4], vec[4];
@@@ -521,7 -456,7 +521,7 @@@ typedef struct UserDef 
        short versions;
        short dbl_click_time;
  
 -      short gameflags;
 +      short pad;
        short wheellinescroll;
        int uiflag;   /* eUserpref_UI_Flag */
        int uiflag2;  /* eUserpref_UI_Flag2 */
        int audioformat;
        int audiochannels;
  
 +      float ui_scale;     /* setting for UI scale */
 +      int ui_line_width;  /* setting for UI line width */
 +      int dpi;            /* runtime, full DPI divided by pixelsize */
 +      float dpi_fac;      /* runtime, multiplier to scale UI elements based on DPI */
 +      float pixelsize;        /* runtime, line width and point size based on DPI */
 +      int virtual_pixel;      /* deprecated, for forward compatibility */
 +
        int scrollback;     /* console scrollback limit */
 -      int dpi;            /* range 48-128? */
 -      float ui_scale;     /* interface scale */
 -      int ui_line_width;  /* interface line width */
        char node_margin;   /* node insert offset (aka auto-offset) margin, but might be useful for later stuff as well */
 -      char pad2;
 +      char pad2[5];
        short transopts;    /* eUserpref_Translation_Flags */
        short menuthreshold1, menuthreshold2;
  
        struct ListBase user_keymaps;
        struct ListBase addons;
        struct ListBase autoexec_paths;
 +      struct ListBase user_menus; /* bUserMenu */
 +
        char keyconfigstr[64];
  
        short undosteps;
        short pad1;
        int undomemory;
 -      int pad3;
 +      float gpu_viewport_quality;
        short gp_manhattendist, gp_euclideandist, gp_eraser;
        short gp_settings;  /* eGP_UserdefSettings */
        short tb_leftmouse, tb_rightmouse;
        struct SolidLight light[3];
 -      short tw_hotspot, tw_flag, tw_handlesize, tw_size;
 +      short gizmo_flag, gizmo_size;
 +      short pad6[3];
        short textimeout, texcollectrate;
 -      short wmdrawmethod; /* eWM_DrawMethod */
        short dragthreshold;
        int memcachelimit;
        int prefetchframes;
        float pad_rot_angle; /* control the rotation step of the view when PAD2, PAD4, PAD6&PAD8 is use */
 -      short frameserverport;
 +      short _pad0;
        short obcenter_dia;
        short rvisize;                  /* rotating view icon size */
        short rvibright;                /* rotating view icon brightness */
        char  keyhandles_new;   /* handle types for newly added keyframes */
        char  gpu_select_method;
        char  gpu_select_pick_deph;
 -      char  pad4;
 +      char  pad0;
        char  view_frame_type;  /* eZoomFrame_Mode */
  
        int view_frame_keyframes; /* number of keyframes to zoom around current frame */
        float view_frame_seconds; /* seconds to zoom around current frame */
  
 -      char _pad0[4];
 +      char _pad1[4];
  
        short widget_unit;              /* private, defaults to 20 for 72 DPI setting */
        short anisotropic_filter;
        float gpencil_new_layer_col[4]; /* default color for newly created Grease Pencil layers */
  
        short tweak_threshold;
 -      char navigation_mode, pad;
 +      char navigation_mode, pad10;
  
        char author[80];        /* author name for file formats supporting it */
  
        int compute_device_id;
  
        float fcu_inactive_alpha;       /* opacity of inactive F-Curves in F-Curve Editor */
 -      float pixelsize;                        /* private, set by GHOST, to multiply DPI with */
 -      int virtual_pixel;                      /* virtual pixelsize mode */
  
        short pie_interaction_type;     /* if keeping a pie menu spawn button pressed after this time, it turns into
                                     * a drag/release pie menu */
        struct WalkNavigation walk_navigation;
  
        short opensubdiv_compute_type;
 -      char pad5[6];
 +      short gpencil_multisamples;     /* eMultiSample_Type, amount of samples for Grease Pencil */
 +
 +      char pad5[4];
  } UserDef;
  
  extern UserDef U; /* from blenkernel blender.c */
@@@ -669,16 -598,15 +669,16 @@@ typedef enum eUserPref_Section 
        USER_SECTION_THEME              = 4,
        USER_SECTION_INPUT              = 5,
        USER_SECTION_ADDONS     = 6,
 +      USER_SECTION_LIGHT      = 7,
  } eUserPref_Section;
  
  /* UserDef.flag */
  typedef enum eUserPref_Flag {
        USER_AUTOSAVE                   = (1 << 0),
 -      USER_FLAG_DEPRECATED_1  = (1 << 1),  /* cleared */
 +      USER_FLAG_NUMINPUT_ADVANCED = (1 << 1),
        USER_FLAG_DEPRECATED_2  = (1 << 2),  /* cleared */
        USER_FLAG_DEPRECATED_3  = (1 << 3),  /* cleared */
 -      USER_SCENEGLOBAL                = (1 << 4),
 +/*    USER_SCENEGLOBAL         = (1 << 4), deprecated */
        USER_TRACKBALL                  = (1 << 5),
        USER_FLAG_DEPRECATED_6  = (1 << 6),  /* cleared */
        USER_FLAG_DEPRECATED_7  = (1 << 7),  /* cleared */
@@@ -748,12 -676,12 +748,12 @@@ typedef enum eUserpref_UI_Flag 
        USER_MENUOPENAUTO               = (1 << 9),
        USER_DEPTH_CURSOR               = (1 << 10),
        USER_AUTOPERSP                  = (1 << 11),
 -      USER_LOCKAROUND         = (1 << 12),
 +      /* USER_LOCKAROUND      = (1 << 12), */  /* DEPRECATED */
        USER_GLOBALUNDO         = (1 << 13),
        USER_ORBIT_SELECTION    = (1 << 14),
        USER_DEPTH_NAVIGATE     = (1 << 15),
        USER_HIDE_DOT                   = (1 << 16),
 -      USER_SHOW_ROTVIEWICON   = (1 << 17),
 +      USER_SHOW_GIZMO_AXIS    = (1 << 17),
        USER_SHOW_VIEWPORTNAME  = (1 << 18),
        USER_CAM_LOCK_NO_PARENT = (1 << 19),
        USER_ZOOM_TO_MOUSEPOS   = (1 << 20),
@@@ -847,6 -775,15 +847,6 @@@ typedef enum eDupli_ID_Flags 
        USER_DUP_PSYS                   = (1 << 11)
  } eDupli_ID_Flags;
  
 -/* UserDef.gameflags */
 -typedef enum eOpenGL_RenderingOptions {
 -      USER_GL_RENDER_DEPRECATED_0                     = (1 << 0),
 -      USER_GL_RENDER_DEPRECATED_1                     = (1 << 1),
 -      USER_DISABLE_MIPMAP                                     = (1 << 2),
 -      USER_GL_RENDER_DEPRECATED_3                     = (1 << 3),
 -      USER_GL_RENDER_DEPRECATED_4                     = (1 << 4),
 -} eOpenGL_RenderingOptions;
 -
  /* selection method for opengl gpu_select_method */
  typedef enum eOpenGL_SelectOptions {
        USER_SELECT_AUTO = 0,
        USER_SELECT_USE_SELECT_RENDERMODE = 2
  } eOpenGL_SelectOptions;
  
 -/* wm draw method.
 - * UserDef.wmdrawmethod */
 -typedef enum eWM_DrawMethod {
 -      USER_DRAW_TRIPLE                = 0,
 -      USER_DRAW_OVERLAP               = 1,
 -      USER_DRAW_FULL                  = 2,
 -      USER_DRAW_AUTOMATIC             = 3,
 -      USER_DRAW_OVERLAP_FLIP  = 4,
 -} eWM_DrawMethod;
 +/* max anti alias draw method UserDef.gpu_viewport_antialias */
 +typedef enum eOpenGL_AntiAliasMethod {
 +      USER_AA_NONE  = 0,
 +      USER_AA_FXAA  = 1,
 +      USER_AA_TAA8  = 2,
 +} eOpenGL_AntiAliasMethod;
  
  /* text draw options
   * UserDef.text_render */
  typedef enum eText_Draw_Options {
        USER_TEXT_DISABLE_AA      = (1 << 0),
-       USER_TEXT_DISABLE_HINTING = (1 << 1),
+       USER_TEXT_HINTING_NONE    = (1 << 1),
+       USER_TEXT_HINTING_SLIGHT  = (1 << 2),
+       USER_TEXT_HINTING_FULL    = (1 << 3),
  } eText_Draw_Options;
  
  /* tw_flag (transform widget) */
@@@ -877,10 -820,6 +880,10 @@@ typedef enum eGP_UserdefSettings 
        GP_PAINT_DOSIMPLIFY             = (1 << 1),
  } eGP_UserdefSettings;
  
 +enum {
 +      USER_GIZMO_DRAW            = (1 << 0),
 +};
 +
  /* Color Picker Types.
   * UserDef.color_picker_type */
  typedef enum eColorPicker_Types {
@@@ -960,7 -899,7 +963,7 @@@ typedef enum eNdof_Flag 
  
  #define NDOF_PIXELS_PER_SECOND 600.0f
  
 -/* UserDef.ogl_multisamples */
 +/* UserDef.ogl_multisamples and gpencil_multisamples */
  typedef enum eMultiSample_Type {
        USER_MULTISAMPLE_NONE   = 0,
        USER_MULTISAMPLE_2      = 2,
index 4c3074bba4f89e789aecde400d73e3fd555f9a33,c3e30de10af8b6b31ce626dcd2804ab38ab5fcb6..9db7b0b807c3a1ad38febc9366045c869402ccc1
  
  #include "BLI_utildefines.h"
  #include "BLI_math_base.h"
 +#include "BLI_math_vector.h"
  
  #include "BKE_appdir.h"
 -#include "BKE_DerivedMesh.h"
  #include "BKE_sound.h"
  #include "BKE_addon.h"
 +#include "BKE_studiolight.h"
  
  #include "RNA_access.h"
  #include "RNA_define.h"
@@@ -53,6 -52,7 +53,6 @@@
  #include "WM_types.h"
  
  #include "BLT_lang.h"
 -#include "GPU_buffers.h"
  
  #ifdef WITH_OPENSUBDIV
  static const EnumPropertyItem opensubdiv_compute_type_items[] = {
  #endif
  
  static const EnumPropertyItem audio_device_items[] = {
 -      {0, "NONE", 0, "None", "Null device - there will be no audio output"},
 -#ifdef WITH_SDL
 -      {1, "SDL", 0, "SDL", "SDL device - simple direct media layer, recommended for sequencer usage"},
 -#endif
 -#ifdef WITH_OPENAL
 -      {2, "OPENAL", 0, "OpenAL", "OpenAL device - supports 3D audio, recommended for game engine usage"},
 -#endif
 -#ifdef WITH_JACK
 -      {3, "JACK", 0, "JACK", "JACK Audio Connection Kit, recommended for pro audio users"},
 -#endif
 +      {0, "Null", 0, "None", "Null device - there will be no audio output"},
        {0, NULL, 0, NULL, NULL}
  };
  
@@@ -78,7 -87,6 +78,7 @@@ const EnumPropertyItem rna_enum_navigat
        {0, NULL, 0, NULL, NULL}
  };
  
 +
  #if defined(WITH_INTERNATIONAL) || !defined(RNA_RUNTIME)
  static const EnumPropertyItem rna_enum_language_default_items[] = {
        {0, "DEFAULT", 0, "Default (Default)", ""},
  };
  #endif
  
 +static const EnumPropertyItem rna_enum_studio_light_orientation_items[] = {
 +      {STUDIOLIGHT_ORIENTATION_CAMERA,     "CAMERA", 0, "Camera", ""},
 +      {STUDIOLIGHT_ORIENTATION_WORLD,      "WORLD",  0, "World",  ""},
 +      {STUDIOLIGHT_ORIENTATION_VIEWNORMAL, "MATCAP", 0, "MatCap", ""},
 +      {0, NULL, 0, NULL, NULL}
 +};
 +
 +
  #ifdef RNA_RUNTIME
  
  #include "DNA_object_types.h"
  #include "DNA_screen_types.h"
  
  #include "BKE_blender.h"
 -#include "BKE_depsgraph.h"
 +#include "BKE_DerivedMesh.h"
  #include "BKE_global.h"
 -#include "BKE_main.h"
  #include "BKE_idprop.h"
 +#include "BKE_main.h"
 +#include "BKE_mesh_runtime.h"
  #include "BKE_pbvh.h"
  #include "BKE_paint.h"
  
 +#include "DEG_depsgraph.h"
 +
  #include "GPU_draw.h"
  #include "GPU_select.h"
  
@@@ -143,11 -140,17 +143,11 @@@ static void rna_userdef_update(Main *UN
  }
  
  /* also used by buffer swap switching */
 -static void rna_userdef_dpi_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *UNUSED(ptr))
 +static void rna_userdef_dpi_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *UNUSED(ptr))
  {
        /* font's are stored at each DPI level, without this we can easy load 100's of fonts */
        BLF_cache_clear();
  
 -      /* force setting drawable again */
 -      wmWindowManager *wm = bmain->wm.first;
 -      if (wm) {
 -              wm->windrawable = NULL;
 -      }
 -
        WM_main_add_notifier(NC_WINDOW, NULL);      /* full redraw */
        WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);    /* refresh region sizes */
  }
@@@ -165,6 -168,34 +165,6 @@@ static void rna_userdef_language_update
        UI_reinit_font();
  }
  
 -static void rna_userdef_show_manipulator_update(Main *bmain, Scene *scene, PointerRNA *ptr)
 -{
 -      UserDef *userdef = (UserDef *)ptr->data;
 -
 -      /* lame, loop over all views and set */
 -      bScreen *sc;
 -      ScrArea *sa;
 -      SpaceLink *sl;
 -
 -      /* from scene copy to the other views */
 -      for (sc = bmain->screen.first; sc; sc = sc->id.next) {
 -              for (sa = sc->areabase.first; sa; sa = sa->next) {
 -                      for (sl = sa->spacedata.first; sl; sl = sl->next) {
 -                              if (sl->spacetype == SPACE_VIEW3D) {
 -                                      View3D *v3d = (View3D *)sl;
 -                                      if (userdef->tw_flag & V3D_USE_MANIPULATOR)
 -                                              v3d->twflag |= V3D_USE_MANIPULATOR;
 -                                      else
 -                                              v3d->twflag &= ~V3D_USE_MANIPULATOR;
 -                              }
 -                      }
 -              }
 -      }
 -
 -      rna_userdef_update(bmain, scene, ptr);
 -}
 -
 -
  static void rna_userdef_script_autoexec_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
  {
        UserDef *userdef = (UserDef *)ptr->data;
@@@ -179,6 -210,12 +179,6 @@@ static void rna_userdef_load_ui_update(
        else G.fileflags &= ~G_FILE_NO_UI;
  }
  
 -static void rna_userdef_mipmap_update(Main *bmain, Scene *scene, PointerRNA *ptr)
 -{
 -      GPU_set_mipmap(bmain, !(U.gameflags & USER_DISABLE_MIPMAP));
 -      rna_userdef_update(bmain, scene, ptr);
 -}
 -
  static void rna_userdef_anisotropic_update(Main *bmain, Scene *scene, PointerRNA *ptr)
  {
        GPU_set_anisotropic(bmain, U.anisotropic_filter);
@@@ -330,11 -367,11 +330,11 @@@ static void rna_UserDef_weight_color_up
        Object *ob;
  
        bTheme *btheme = UI_GetTheme();
 -      vDM_ColorBand_store((U.flag & USER_CUSTOM_RANGE) ? (&U.coba_weight) : NULL, btheme->tv3d.vertex_unreferenced);
 +      BKE_mesh_runtime_color_band_store((U.flag & USER_CUSTOM_RANGE) ? (&U.coba_weight) : NULL, btheme->tv3d.vertex_unreferenced);
  
        for (ob = bmain->object.first; ob; ob = ob->id.next) {
                if (ob->mode & OB_MODE_WEIGHT_PAINT)
 -                      DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
 +                      DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        }
  
        rna_userdef_update(bmain, scene, ptr);
@@@ -471,7 -508,7 +471,7 @@@ static void rna_userdef_opensubdiv_upda
                if (object->derivedFinal != NULL &&
                    object->derivedFinal->type == DM_TYPE_CCGDM)
                {
 -                      DAG_id_tag_update(&object->id, OB_RECALC_OB);
 +                      DEG_id_tag_update(&object->id, OB_RECALC_OB);
                }
        }
  }
@@@ -485,6 -522,7 +485,6 @@@ static const EnumPropertyItem *rna_user
        int totitem = 0;
        EnumPropertyItem *item = NULL;
  
 -#ifdef WITH_SYSTEM_AUDASPACE
        int i;
  
        char **names = BKE_sound_get_device_names();
                EnumPropertyItem new_item = {i, names[i], 0, names[i], names[i]};
                RNA_enum_item_add(&item, &totitem, &new_item);
        }
 -#else
 -      /* NONE */
 -      RNA_enum_item_add(&item, &totitem, &audio_device_items[index++]);
 -
 -#ifdef WITH_SDL
 -#  ifdef WITH_SDL_DYNLOAD
 -      if (sdlewInit() == SDLEW_SUCCESS)
 -#  endif
 -      {
 -              RNA_enum_item_add(&item, &totitem, &audio_device_items[index]);
 -      }
 -      index++;
 -#endif
 -
 -#ifdef WITH_OPENAL
 -      RNA_enum_item_add(&item, &totitem, &audio_device_items[index++]);
 -#endif
 -
 -#ifdef WITH_JACK
 -      if (BKE_sound_is_jack_supported()) {
 -              RNA_enum_item_add(&item, &totitem, &audio_device_items[index]);
 -      }
 -      index++;
 -#endif
 -#endif
  
        /* may be unused */
        UNUSED_VARS(index, audio_device_items);
@@@ -611,140 -674,6 +611,140 @@@ static StructRNA *rna_AddonPref_refine(
        return (ptr->type) ? ptr->type : &RNA_AddonPreferences;
  }
  
 +static float rna_ThemeUI_roundness_get(PointerRNA *ptr)
 +{
 +      /* Remap from relative radius to 0..1 range. */
 +      uiWidgetColors *tui = (uiWidgetColors *)ptr->data;
 +      return tui->roundness * 2.0f;
 +}
 +
 +static void rna_ThemeUI_roundness_set(PointerRNA *ptr, float value)
 +{
 +      uiWidgetColors *tui = (uiWidgetColors *)ptr->data;
 +      tui->roundness = value * 0.5f;
 +}
 +
 +/* Studio Light */
 +static void rna_UserDef_studiolight_begin(CollectionPropertyIterator *iter, PointerRNA *UNUSED(ptr))
 +{
 +      rna_iterator_listbase_begin(iter, BKE_studiolight_listbase(), NULL);
 +}
 +
 +static void rna_StudioLights_refresh(UserDef *UNUSED(userdef))
 +{
 +      BKE_studiolight_refresh();
 +}
 +
 +static void rna_StudioLights_remove(UserDef *UNUSED(userdef), StudioLight *studio_light)
 +{
 +      BKE_studiolight_remove(studio_light);
 +}
 +
 +static StudioLight *rna_StudioLights_new(UserDef *UNUSED(userdef), const char *path, int orientation)
 +{
 +      return BKE_studiolight_new(path, orientation);
 +}
 +
 +/* StudioLight.name */
 +static void rna_UserDef_studiolight_name_get(PointerRNA *ptr, char *value)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      BLI_strncpy(value, sl->name, FILE_MAXFILE);
 +}
 +
 +static int rna_UserDef_studiolight_name_length(PointerRNA *ptr)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      return strlen(sl->name);
 +}
 +
 +/* StudioLight.path */
 +static void rna_UserDef_studiolight_path_get(PointerRNA *ptr, char *value)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      BLI_strncpy(value, sl->path, FILE_MAX);
 +}
 +
 +static int rna_UserDef_studiolight_path_length(PointerRNA *ptr)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      return strlen(sl->path);
 +}
 +
 +/* StudioLight.path_irr_cache */
 +static void rna_UserDef_studiolight_path_irr_cache_get(PointerRNA *ptr, char *value)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      if (sl->path_irr_cache) {
 +              BLI_strncpy(value, sl->path_irr_cache, FILE_MAX);
 +      }
 +      else {
 +              value[0] = '\0';
 +      }
 +}
 +
 +static int rna_UserDef_studiolight_path_irr_cache_length(PointerRNA *ptr)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      if (sl->path_irr_cache) {
 +              return strlen(sl->path_irr_cache);
 +      }
 +      return 0;
 +}
 +
 +/* StudioLight.path_sh_cache */
 +static void rna_UserDef_studiolight_path_sh_cache_get(PointerRNA *ptr, char *value)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      if (sl->path_sh_cache) {
 +              BLI_strncpy(value, sl->path_sh_cache, FILE_MAX);
 +      }
 +      else {
 +              value[0] = '\0';
 +      }
 +}
 +
 +static int rna_UserDef_studiolight_path_sh_cache_length(PointerRNA *ptr)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      if (sl->path_sh_cache) {
 +              return strlen(sl->path_sh_cache);
 +      }
 +      return 0;
 +}
 +
 +/* StudioLight.index */
 +static int rna_UserDef_studiolight_index_get(PointerRNA *ptr)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      return sl->index;
 +}
 +
 +/* StudioLight.is_user_defined */
 +static bool rna_UserDef_studiolight_is_user_defined_get(PointerRNA *ptr)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      return (sl->flag & STUDIOLIGHT_USER_DEFINED) != 0;
 +}
 +
 +/* StudioLight.orientation */
 +
 +static int rna_UserDef_studiolight_orientation_get(PointerRNA *ptr)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      return sl->flag & STUDIOLIGHT_FLAG_ORIENTATIONS;
 +}
 +
 +static void rna_UserDef_studiolight_spherical_harmonics_coefficients_get(PointerRNA *ptr, float *values)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      float *value = values;
 +      for (int i = 0; i < STUDIOLIGHT_SPHERICAL_HARMONICS_COMPONENTS; i++) {
 +              copy_v3_v3(value, sl->spherical_harmonics_coefs[i]);
 +              value += 3;
 +      }
 +}
 +
  #else
  
  /* TODO(sergey): This technically belongs to blenlib, but we don't link
@@@ -915,11 -844,6 +915,11 @@@ static void rna_def_userdef_theme_ui_wc
        RNA_def_property_range(prop, -100, 100);
        RNA_def_property_ui_text(prop, "Shade Down", "");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
 +
 +      prop = RNA_def_property(srna, "roundness", PROP_FLOAT, PROP_FACTOR);
 +      RNA_def_property_float_funcs(prop, "rna_ThemeUI_roundness_get", "rna_ThemeUI_roundness_set", NULL);
 +      RNA_def_property_ui_text(prop, "Roundness", "Amount of edge rounding");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
  }
  
  static void rna_def_userdef_theme_ui_wcol_state(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Driven Selected", "");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
 +      prop = RNA_def_property(srna, "inner_overridden", PROP_FLOAT, PROP_COLOR_GAMMA);
 +      RNA_def_property_array(prop, 3);
 +      RNA_def_property_ui_text(prop, "Overridden", "");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
 +
 +      prop = RNA_def_property(srna, "inner_overridden_sel", PROP_FLOAT, PROP_COLOR_GAMMA);
 +      RNA_def_property_array(prop, 3);
 +      RNA_def_property_ui_text(prop, "Overridden Selected", "");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
 +
        prop = RNA_def_property(srna, "blend", PROP_FLOAT, PROP_FACTOR);
        RNA_def_property_ui_text(prop, "Blend", "");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
@@@ -995,8 -909,12 +995,8 @@@ static void rna_def_userdef_theme_ui_pa
        RNA_def_property_ui_text(prop, "Background", "");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
 -      prop = RNA_def_property(srna, "show_header", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_ui_text(prop, "Show Header", "");
 -      RNA_def_property_update(prop, 0, "rna_userdef_update");
 -
 -      prop = RNA_def_property(srna, "show_back", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_ui_text(prop, "Show Background", "");
 +      prop = RNA_def_property(srna, "sub_back", PROP_FLOAT, PROP_COLOR_GAMMA);
 +      RNA_def_property_ui_text(prop, "Sub Background", "");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  }
  
@@@ -1051,11 -969,6 +1051,11 @@@ static void rna_def_userdef_theme_ui(Bl
        RNA_def_property_ui_text(prop, "Tool Widget Colors", "");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
 +      prop = RNA_def_property(srna, "wcol_toolbar_item", PROP_POINTER, PROP_NONE);
 +      RNA_def_property_flag(prop, PROP_NEVER_NULL);
 +      RNA_def_property_ui_text(prop, "Toolbar Item Widget Colors", "");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
 +
        prop = RNA_def_property(srna, "wcol_radio", PROP_POINTER, PROP_NONE);
        RNA_def_property_flag(prop, PROP_NEVER_NULL);
        RNA_def_property_ui_text(prop, "Radio Widget Colors", "");
        RNA_def_property_ui_text(prop, "State Colors", "");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
 +      prop = RNA_def_property(srna, "wcol_tab", PROP_POINTER, PROP_NONE);
 +      RNA_def_property_flag(prop, PROP_NEVER_NULL);
 +      RNA_def_property_ui_text(prop, "Tab Colors", "");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
 +
        prop = RNA_def_property(srna, "menu_shadow_fac", PROP_FLOAT, PROP_FACTOR);
        RNA_def_property_ui_text(prop, "Menu Shadow Strength", "Blending factor for menu shadows");
        RNA_def_property_range(prop, 0.01f, 1.0f);
        RNA_def_property_ui_text(prop, "Icon Alpha", "Transparency of icons in the interface, to reduce contrast");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
 +      prop = RNA_def_property(srna, "icon_saturation", PROP_FLOAT, PROP_FACTOR);
 +      RNA_def_property_ui_text(prop, "Icon Saturation", "Saturation of icons in the interface");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
 +
        prop = RNA_def_property(srna, "widget_emboss", PROP_FLOAT, PROP_COLOR_GAMMA);
        RNA_def_property_float_sdna(prop, NULL, "widget_emboss");
        RNA_def_property_array(prop, 4);
        RNA_def_property_ui_text(prop, "Widget Emboss", "Color of the 1px shadow line underlying widgets");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
 +      prop = RNA_def_property(srna, "editor_outline", PROP_FLOAT, PROP_COLOR_GAMMA);
 +      RNA_def_property_float_sdna(prop, NULL, "editor_outline");
 +      RNA_def_property_array(prop, 3);
 +      RNA_def_property_ui_text(prop, "Editor Outline", "Color of the outline of the editors and their round corners");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
 +
        /* axis */
        prop = RNA_def_property(srna, "axis_x", PROP_FLOAT, PROP_COLOR_GAMMA);
        RNA_def_property_float_sdna(prop, NULL, "xaxis");
        RNA_def_property_array(prop, 3);
        RNA_def_property_ui_text(prop, "Z Axis", "");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
 +
 +      /* Generic gizmo colors. */
 +      prop = RNA_def_property(srna, "gizmo_hi", PROP_FLOAT, PROP_COLOR_GAMMA);
 +      RNA_def_property_float_sdna(prop, NULL, "gizmo_hi");
 +      RNA_def_property_array(prop, 3);
 +      RNA_def_property_ui_text(prop, "Gizmo Highlight", "");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
 +
 +      prop = RNA_def_property(srna, "gizmo_primary", PROP_FLOAT, PROP_COLOR_GAMMA);
 +      RNA_def_property_float_sdna(prop, NULL, "gizmo_primary");
 +      RNA_def_property_array(prop, 3);
 +      RNA_def_property_ui_text(prop, "Gizmo Primary", "");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
 +
 +      prop = RNA_def_property(srna, "gizmo_secondary", PROP_FLOAT, PROP_COLOR_GAMMA);
 +      RNA_def_property_float_sdna(prop, NULL, "gizmo_secondary");
 +      RNA_def_property_array(prop, 3);
 +      RNA_def_property_ui_text(prop, "Gizmo Secondary", "");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
 +
 +      prop = RNA_def_property(srna, "gizmo_a", PROP_FLOAT, PROP_COLOR_GAMMA);
 +      RNA_def_property_float_sdna(prop, NULL, "gizmo_a");
 +      RNA_def_property_array(prop, 3);
 +      RNA_def_property_ui_text(prop, "Gizmo A", "");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
 +
 +      prop = RNA_def_property(srna, "gizmo_b", PROP_FLOAT, PROP_COLOR_GAMMA);
 +      RNA_def_property_float_sdna(prop, NULL, "gizmo_b");
 +      RNA_def_property_array(prop, 3);
 +      RNA_def_property_ui_text(prop, "Gizmo B", "");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
  }
  
  static void rna_def_userdef_theme_space_common(StructRNA *srna)
  
        /* header */
        prop = RNA_def_property(srna, "header", PROP_FLOAT, PROP_COLOR_GAMMA);
 -      RNA_def_property_array(prop, 3);
 +      RNA_def_property_array(prop, 4);
        RNA_def_property_ui_text(prop, "Header", "");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
@@@ -1433,7 -1300,7 +1433,7 @@@ static void rna_def_userdef_theme_space
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
        prop = RNA_def_property(srna, "vertex_size", PROP_INT, PROP_NONE);
 -      RNA_def_property_range(prop, 1, 10);
 +      RNA_def_property_range(prop, 1, 32);
        RNA_def_property_ui_text(prop, "Vertex Size", "");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
@@@ -1655,7 -1522,7 +1655,7 @@@ static void rna_def_userdef_theme_space
                RNA_def_property_update(prop, 0, "rna_userdef_update");
  
                prop = RNA_def_property(srna, "handle_vertex_size", PROP_INT, PROP_NONE);
 -              RNA_def_property_range(prop, 0, 255);
 +              RNA_def_property_range(prop, 1, 100);
                RNA_def_property_ui_text(prop, "Handle Vertex Size", "");
                RNA_def_property_update(prop, 0, "rna_userdef_update");
        }
@@@ -1714,7 -1581,7 +1714,7 @@@ static void rna_def_userdef_theme_space
  
        prop = RNA_def_property(srna, "wire_edit", PROP_FLOAT, PROP_COLOR_GAMMA);
        RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Wire Edit", "");
 +      RNA_def_property_ui_text(prop, "Wire Edit", "Color for wireframe when in edit mode, but edge selection is active");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
  
        RNA_def_property_ui_text(prop, "Active Object", "");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
 -      prop = RNA_def_property(srna, "object_grouped", PROP_FLOAT, PROP_COLOR_GAMMA);
 -      RNA_def_property_float_sdna(prop, NULL, "group");
 -      RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Object Grouped", "");
 -      RNA_def_property_update(prop, 0, "rna_userdef_update");
 -
 -      prop = RNA_def_property(srna, "object_grouped_active", PROP_FLOAT, PROP_COLOR_GAMMA);
 -      RNA_def_property_float_sdna(prop, NULL, "group_active");
 -      RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Object Grouped Active", "");
 -      RNA_def_property_update(prop, 0, "rna_userdef_update");
 -
        prop = RNA_def_property(srna, "text_keyframe", PROP_FLOAT, PROP_COLOR_GAMMA);
        RNA_def_property_float_sdna(prop, NULL, "time_keyframe");
        RNA_def_property_array(prop, 3);
        RNA_def_property_ui_text(prop, "Empty", "");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
 -      prop = RNA_def_property(srna, "lamp", PROP_FLOAT, PROP_COLOR_GAMMA);
 +      prop = RNA_def_property(srna, "light", PROP_FLOAT, PROP_COLOR_GAMMA);
 +      RNA_def_property_float_sdna(prop, NULL, "lamp");
        RNA_def_property_array(prop, 4);
 -      RNA_def_property_ui_text(prop, "Lamp", "");
 +      RNA_def_property_ui_text(prop, "Light", "");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
        prop = RNA_def_property(srna, "speaker", PROP_FLOAT, PROP_COLOR_GAMMA);
@@@ -2390,6 -2268,23 +2390,6 @@@ static void rna_def_userdef_theme_space
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  }
  
 -static void rna_def_userdef_theme_space_logic(BlenderRNA *brna)
 -{
 -      StructRNA *srna;
 -//    PropertyRNA *prop;
 -
 -      /* space_logic */
 -
 -      srna = RNA_def_struct(brna, "ThemeLogicEditor", NULL);
 -      RNA_def_struct_sdna(srna, "ThemeSpace");
 -      RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
 -      RNA_def_struct_ui_text(srna, "Theme Logic Editor", "Theme settings for the Logic Editor");
 -
 -      rna_def_userdef_theme_spaces_main(srna);
 -
 -}
 -
 -
  static void rna_def_userdef_theme_space_buts(BlenderRNA *brna)
  {
        StructRNA *srna;
  
  }
  
 -static void rna_def_userdef_theme_space_time(BlenderRNA *brna)
 -{
 -      StructRNA *srna;
 -      PropertyRNA *prop;
 -
 -      /* space_time */
 -
 -      srna = RNA_def_struct(brna, "ThemeTimeline", NULL);
 -      RNA_def_struct_sdna(srna, "ThemeSpace");
 -      RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
 -      RNA_def_struct_ui_text(srna, "Theme Timeline", "Theme settings for the Timeline");
 -
 -      rna_def_userdef_theme_spaces_main(srna);
 -
 -      prop = RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
 -      RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Grid", "");
 -      RNA_def_property_update(prop, 0, "rna_userdef_update");
 -
 -      prop = RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR_GAMMA);
 -      RNA_def_property_float_sdna(prop, NULL, "cframe");
 -      RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Current Frame", "");
 -      RNA_def_property_update(prop, 0, "rna_userdef_update");
 -
 -      prop = RNA_def_property(srna, "time_keyframe", PROP_FLOAT, PROP_COLOR_GAMMA);
 -      RNA_def_property_float_sdna(prop, NULL, "time_keyframe");
 -      RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Keyframe", "Base color for keyframe indicator lines");
 -      RNA_def_property_update(prop, 0, "rna_userdef_update");
 -
 -      prop = RNA_def_property(srna, "time_grease_pencil", PROP_FLOAT, PROP_COLOR_GAMMA);
 -      RNA_def_property_float_sdna(prop, NULL, "time_gp_keyframe");
 -      RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Grease Pencil", "Color of Grease Pencil keyframes");
 -      RNA_def_property_update(prop, 0, "rna_userdef_update");
 -}
 -
  static void rna_def_userdef_theme_space_image(BlenderRNA *brna)
  {
        StructRNA *srna;
@@@ -2807,7 -2740,7 +2807,7 @@@ static void rna_def_userdef_theme_space
        srna = RNA_def_struct(brna, "ThemeNLAEditor", NULL);
        RNA_def_struct_sdna(srna, "ThemeSpace");
        RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
 -      RNA_def_struct_ui_text(srna, "Theme NLA Editor", "Theme settings for the NLA Editor");
 +      RNA_def_struct_ui_text(srna, "Theme Nonlinear Animation", "Theme settings for the NLA Editor");
  
        rna_def_userdef_theme_spaces_main(srna);
        rna_def_userdef_theme_spaces_list_main(srna);
@@@ -3037,34 -2970,6 +3037,34 @@@ static void rna_def_userdef_theme_space
        rna_def_userdef_theme_spaces_curves(srna, false, false, false, true);
  }
  
 +static void rna_def_userdef_theme_space_topbar(BlenderRNA *brna)
 +{
 +      StructRNA *srna;
 +
 +      /* space_topbar */
 +
 +      srna = RNA_def_struct(brna, "ThemeTopBar", NULL);
 +      RNA_def_struct_sdna(srna, "ThemeSpace");
 +      RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
 +      RNA_def_struct_ui_text(srna, "Theme Top Bar", "Theme settings for the Top Bar");
 +
 +      rna_def_userdef_theme_spaces_main(srna);
 +}
 +
 +static void rna_def_userdef_theme_space_statusbar(BlenderRNA *brna)
 +{
 +      StructRNA *srna;
 +
 +      /* space_statusbar */
 +
 +      srna = RNA_def_struct(brna, "ThemeStatusBar", NULL);
 +      RNA_def_struct_sdna(srna, "ThemeSpace");
 +      RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
 +      RNA_def_struct_ui_text(srna, "Theme Status Bar", "Theme settings for the Status Bar");
 +
 +      rna_def_userdef_theme_spaces_main(srna);
 +}
 +
  static void rna_def_userdef_themes(BlenderRNA *brna)
  {
        StructRNA *srna;
                {19, "STYLE", ICON_FONTPREVIEW, "Text Style", ""},
                {18, "BONE_COLOR_SETS", ICON_COLOR, "Bone Color Sets", ""},
                {1, "VIEW_3D", ICON_VIEW3D, "3D View", ""},
 -              {2, "TIMELINE", ICON_TIME, "Timeline", ""},
                {3, "GRAPH_EDITOR", ICON_IPO, "Graph Editor", ""},
                {4, "DOPESHEET_EDITOR", ICON_ACTION, "Dope Sheet", ""},
 -              {5, "NLA_EDITOR", ICON_NLA, "NLA Editor", ""},
 +              {5, "NLA_EDITOR", ICON_NLA, "Nonlinear Animation", ""},
                {6, "IMAGE_EDITOR", ICON_IMAGE_COL, "UV/Image Editor", ""},
                {7, "SEQUENCE_EDITOR", ICON_SEQUENCE, "Video Sequence Editor", ""},
                {8, "TEXT_EDITOR", ICON_TEXT, "Text Editor", ""},
                {9, "NODE_EDITOR", ICON_NODETREE, "Node Editor", ""},
 -              {10, "LOGIC_EDITOR", ICON_LOGIC, "Logic Editor", ""},
                {11, "PROPERTIES", ICON_BUTS, "Properties", ""},
                {12, "OUTLINER", ICON_OOPS, "Outliner", ""},
                {14, "USER_PREFERENCES", ICON_PREFERENCES, "User Preferences", ""},
                {16, "FILE_BROWSER", ICON_FILESEL, "File Browser", ""},
                {17, "CONSOLE", ICON_CONSOLE, "Python Console", ""},
                {20, "CLIP_EDITOR", ICON_CLIP, "Movie Clip Editor", ""},
 +              {21, "TOPBAR", ICON_NONE, "Top Bar", ""},
 +              {22, "STATUSBAR", ICON_NONE, "Status Bar", ""},
                {0, NULL, 0, NULL, NULL}
        };
  
        RNA_def_property_flag(prop, PROP_NEVER_NULL);
        RNA_def_property_pointer_sdna(prop, NULL, "tnla");
        RNA_def_property_struct_type(prop, "ThemeNLAEditor");
 -      RNA_def_property_ui_text(prop, "NLA Editor", "");
 +      RNA_def_property_ui_text(prop, "Nonlinear Animation", "");
  
        prop = RNA_def_property(srna, "dopesheet_editor", PROP_POINTER, PROP_NONE);
        RNA_def_property_flag(prop, PROP_NEVER_NULL);
        RNA_def_property_struct_type(prop, "ThemeTextEditor");
        RNA_def_property_ui_text(prop, "Text Editor", "");
  
 -      prop = RNA_def_property(srna, "timeline", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_flag(prop, PROP_NEVER_NULL);
 -      RNA_def_property_pointer_sdna(prop, NULL, "ttime");
 -      RNA_def_property_struct_type(prop, "ThemeTimeline");
 -      RNA_def_property_ui_text(prop, "Timeline", "");
 -
        prop = RNA_def_property(srna, "node_editor", PROP_POINTER, PROP_NONE);
        RNA_def_property_flag(prop, PROP_NEVER_NULL);
        RNA_def_property_pointer_sdna(prop, NULL, "tnode");
        RNA_def_property_struct_type(prop, "ThemeNodeEditor");
        RNA_def_property_ui_text(prop, "Node Editor", "");
  
 -      prop = RNA_def_property(srna, "logic_editor", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_flag(prop, PROP_NEVER_NULL);
 -      RNA_def_property_pointer_sdna(prop, NULL, "tlogic");
 -      RNA_def_property_struct_type(prop, "ThemeLogicEditor");
 -      RNA_def_property_ui_text(prop, "Logic Editor", "");
 -
        prop = RNA_def_property(srna, "outliner", PROP_POINTER, PROP_NONE);
        RNA_def_property_flag(prop, PROP_NEVER_NULL);
        RNA_def_property_pointer_sdna(prop, NULL, "toops");
        RNA_def_property_pointer_sdna(prop, NULL, "tclip");
        RNA_def_property_struct_type(prop, "ThemeClipEditor");
        RNA_def_property_ui_text(prop, "Clip Editor", "");
 +
 +      prop = RNA_def_property(srna, "topbar", PROP_POINTER, PROP_NONE);
 +      RNA_def_property_flag(prop, PROP_NEVER_NULL);
 +      RNA_def_property_pointer_sdna(prop, NULL, "ttopbar");
 +      RNA_def_property_struct_type(prop, "ThemeTopBar");
 +      RNA_def_property_ui_text(prop, "Top Bar", "");
 +
 +      prop = RNA_def_property(srna, "statusbar", PROP_POINTER, PROP_NONE);
 +      RNA_def_property_flag(prop, PROP_NEVER_NULL);
 +      RNA_def_property_pointer_sdna(prop, NULL, "tstatusbar");
 +      RNA_def_property_struct_type(prop, "ThemeStatusBar");
 +      RNA_def_property_ui_text(prop, "Status Bar", "");
  }
  
  static void rna_def_userdef_addon(BlenderRNA *brna)
        RNA_def_property_pointer_funcs(prop, "rna_Addon_preferences_get", NULL, NULL, NULL);
  }
  
 +static void rna_def_userdef_studiolights(BlenderRNA *brna)
 +{
 +      StructRNA *srna;
 +      FunctionRNA *func;
 +      PropertyRNA *parm;
 +
 +      srna = RNA_def_struct(brna, "StudioLights", NULL);
 +      RNA_def_struct_sdna(srna, "UserDef");
 +      RNA_def_struct_ui_text(srna, "Studio Lights", "Collection of studio lights");
 +
 +      func = RNA_def_function(srna, "new", "rna_StudioLights_new");
 +      RNA_def_function_ui_description(func, "Create a new studiolight");
 +      parm = RNA_def_string(func, "path", NULL, 0, "File Path", "File path where the studio light file can be found");
 +      RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
 +      parm = RNA_def_enum(func, "orientation", rna_enum_studio_light_orientation_items, STUDIOLIGHT_ORIENTATION_WORLD, "Orientation", "The orientation for the new studio light");
 +      RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
 +      parm = RNA_def_pointer(func, "studio_light", "StudioLight", "", "Newly created StudioLight");
 +      RNA_def_function_return(func, parm);
 +
 +      func = RNA_def_function(srna, "remove", "rna_StudioLights_remove");
 +      RNA_def_function_ui_description(func, "Remove a studio light");
 +      parm = RNA_def_pointer(func, "studio_light", "StudioLight", "", "The studio light to remove");
 +      RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
 +
 +      func = RNA_def_function(srna, "refresh", "rna_StudioLights_refresh");
 +      RNA_def_function_ui_description(func, "Refresh Studio Lights from disk");
 +}
 +
 +static void rna_def_userdef_studiolight(BlenderRNA *brna)
 +{
 +      StructRNA *srna;
 +      PropertyRNA *prop;
 +
 +      RNA_define_verify_sdna(false);
 +      srna = RNA_def_struct(brna, "StudioLight", NULL);
 +      RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
 +      RNA_def_struct_ui_text(srna, "Studio Light", "Studio light");
 +
 +      prop = RNA_def_property(srna, "index", PROP_INT, PROP_NONE);
 +      RNA_def_property_int_funcs(prop, "rna_UserDef_studiolight_index_get", NULL, NULL);
 +      RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 +      RNA_def_property_ui_text(prop, "Index", "");
 +
 +      prop = RNA_def_property(srna, "is_user_defined", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_funcs(prop, "rna_UserDef_studiolight_is_user_defined_get", NULL);
 +      RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 +      RNA_def_property_ui_text(prop, "User Defined", "");
 +
 +      prop = RNA_def_property(srna, "orientation", PROP_ENUM, PROP_NONE);
 +      RNA_def_property_enum_items(prop, rna_enum_studio_light_orientation_items);
 +      RNA_def_property_enum_funcs(prop, "rna_UserDef_studiolight_orientation_get", NULL, NULL);
 +      RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 +      RNA_def_property_ui_text(prop, "Orientation", "");
 +
 +      prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
 +      RNA_def_property_string_funcs(prop, "rna_UserDef_studiolight_name_get", "rna_UserDef_studiolight_name_length", NULL);
 +      RNA_def_property_ui_text(prop, "Name", "");
 +      RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 +      RNA_def_struct_name_property(srna, prop);
 +
 +      prop = RNA_def_property(srna, "path", PROP_STRING, PROP_DIRPATH);
 +      RNA_def_property_string_funcs(prop, "rna_UserDef_studiolight_path_get", "rna_UserDef_studiolight_path_length", NULL);
 +      RNA_def_property_ui_text(prop, "Path", "");
 +      RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 +
 +      prop = RNA_def_property(srna, "path_irr_cache", PROP_STRING, PROP_DIRPATH);
 +      RNA_def_property_string_funcs(prop, "rna_UserDef_studiolight_path_irr_cache_get", "rna_UserDef_studiolight_path_irr_cache_length", NULL);
 +      RNA_def_property_ui_text(prop, "Irradiance Cache Path", "Path where the irradiance cache is stored");
 +      RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 +
 +      prop = RNA_def_property(srna, "path_sh_cache", PROP_STRING, PROP_DIRPATH);
 +      RNA_def_property_string_funcs(prop, "rna_UserDef_studiolight_path_sh_cache_get", "rna_UserDef_studiolight_path_sh_cache_length", NULL);
 +      RNA_def_property_ui_text(prop, "SH Cache Path", "Path where the spherical harmonics cache is stored");
 +      RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 +
 +      const int spherical_harmonics_dim[] = {STUDIOLIGHT_SPHERICAL_HARMONICS_COMPONENTS, 3};
 +      prop = RNA_def_property(srna, "spherical_harmonics_coefficients", PROP_FLOAT, PROP_COLOR);
 +      RNA_def_property_multi_array(prop, 2, spherical_harmonics_dim);
 +      RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 +      RNA_def_property_float_funcs(prop, "rna_UserDef_studiolight_spherical_harmonics_coefficients_get", NULL, NULL);
 +
 +      RNA_define_verify_sdna(true);
 +}
 +
  static void rna_def_userdef_pathcompare(BlenderRNA *brna)
  {
        StructRNA *srna;
@@@ -3391,14 -3212,14 +3391,14 @@@ static void rna_def_userdef_dothemes(Bl
        rna_def_userdef_theme_space_seq(brna);
        rna_def_userdef_theme_space_buts(brna);
        rna_def_userdef_theme_space_text(brna);
 -      rna_def_userdef_theme_space_time(brna);
        rna_def_userdef_theme_space_node(brna);
        rna_def_userdef_theme_space_outliner(brna);
        rna_def_userdef_theme_space_info(brna);
        rna_def_userdef_theme_space_userpref(brna);
        rna_def_userdef_theme_space_console(brna);
 -      rna_def_userdef_theme_space_logic(brna);
        rna_def_userdef_theme_space_clip(brna);
 +      rna_def_userdef_theme_space_topbar(brna);
 +      rna_def_userdef_theme_space_statusbar(brna);
        rna_def_userdef_theme_colorset(brna);
        rna_def_userdef_themes(brna);
  }
@@@ -3426,6 -3247,12 +3426,6 @@@ static void rna_def_userdef_solidlight(
        RNA_def_property_ui_text(prop, "Direction", "Direction that the OpenGL light is shining");
        RNA_def_property_update(prop, 0, "rna_UserDef_viewport_lights_update");
  
 -      prop = RNA_def_property(srna, "diffuse_color", PROP_FLOAT, PROP_COLOR);
 -      RNA_def_property_float_sdna(prop, NULL, "col");
 -      RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Diffuse Color", "Diffuse color of the OpenGL light");
 -      RNA_def_property_update(prop, 0, "rna_UserDef_viewport_lights_update");
 -
        prop = RNA_def_property(srna, "specular_color", PROP_FLOAT, PROP_COLOR);
        RNA_def_property_float_sdna(prop, NULL, "spec");
        RNA_def_property_array(prop, 3);
@@@ -3539,7 -3366,7 +3539,7 @@@ static void rna_def_userdef_view(Blende
        RNA_def_property_ui_text(prop, "Tooltips", "Display tooltips (when off hold Alt to force display)");
  
        prop = RNA_def_property(srna, "show_tooltips_python", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", USER_TOOLTIPS_PYTHON);
 +      RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_TOOLTIPS_PYTHON);
        RNA_def_property_ui_text(prop, "Python Tooltips", "Show Python references in tooltips");
  
        prop = RNA_def_property(srna, "show_developer_ui", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_ui_text(prop, "Display Object Info", "Display objects name and frame number in 3D view");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
 -      prop = RNA_def_property(srna, "use_global_scene", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_SCENEGLOBAL);
 -      RNA_def_property_ui_text(prop, "Global Scene", "Force the current Scene to be displayed in all Screens");
 -      RNA_def_property_update(prop, 0, "rna_userdef_update");
 -
        prop = RNA_def_property(srna, "show_large_cursors", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "curssize", 0);
        RNA_def_property_ui_text(prop, "Large Cursors", "Use large mouse cursors when available");
                                 "Otherwise menus, etc will always be top to bottom, left to right, "
                                 "no matter opening direction");
  
 -      prop = RNA_def_property(srna, "use_global_pivot", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_LOCKAROUND);
 -      RNA_def_property_ui_text(prop, "Global Pivot", "Lock the same rotation/scaling pivot in all 3D Views");
 -
        prop = RNA_def_property(srna, "use_mouse_depth_navigate", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_DEPTH_NAVIGATE);
        RNA_def_property_ui_text(prop, "Auto Depth",
        RNA_def_property_ui_text(prop, "Rotate Around Selection", "Use selection as the pivot point");
  
        /* mini axis */
 -      prop = RNA_def_property(srna, "show_mini_axis", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_SHOW_ROTVIEWICON);
 -      RNA_def_property_ui_text(prop, "Show Mini Axes",
 -                               "Show a small rotating 3D axes in the bottom left corner of the 3D View");
 +      static const EnumPropertyItem mini_axis_type_items[] = {
 +              {0, "MINIMAL", 0, "Simple Axis", ""},
 +              {USER_SHOW_GIZMO_AXIS, "GIZMO", 0, "Interactive Navigation", ""},
 +              {0, NULL, 0, NULL, NULL}
 +      };
 +
 +      prop = RNA_def_property(srna, "mini_axis_type", PROP_ENUM, PROP_NONE);
 +      RNA_def_property_enum_items(prop, mini_axis_type_items);
 +      RNA_def_property_enum_bitflag_sdna(prop, NULL, "uiflag");
 +      RNA_def_property_ui_text(prop, "Mini Axes Type",
 +                               "Show a small rotating 3D axes in the top right corner of the 3D View");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
        prop = RNA_def_property(srna, "mini_axis_size", PROP_INT, PROP_NONE);
        RNA_def_property_ui_text(prop, "Rotation Angle", "Rotation step for numerical pad keys (2 4 6 8)");
  
        /* 3D transform widget */
 -      prop = RNA_def_property(srna, "show_manipulator", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "tw_flag", V3D_USE_MANIPULATOR);
 -      RNA_def_property_ui_text(prop, "Manipulator", "Use 3D transform manipulator");
 -      RNA_def_property_update(prop, 0, "rna_userdef_show_manipulator_update");
 +      prop = RNA_def_property(srna, "show_gizmo", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "gizmo_flag", USER_GIZMO_DRAW);
 +      RNA_def_property_ui_text(prop, "Gizmos", "Use transform gizmos by default");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
  
 -      prop = RNA_def_property(srna, "manipulator_size", PROP_INT, PROP_PIXEL);
 -      RNA_def_property_int_sdna(prop, NULL, "tw_size");
 +      prop = RNA_def_property(srna, "gizmo_size", PROP_INT, PROP_PIXEL);
 +      RNA_def_property_int_sdna(prop, NULL, "gizmo_size");
        RNA_def_property_range(prop, 10, 200);
        RNA_def_property_int_default(prop, 75);
 -      RNA_def_property_ui_text(prop, "Manipulator Size", "Diameter of the manipulator");
 +      RNA_def_property_ui_text(prop, "Gizmo Size", "Diameter of the gizmo");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
 -      prop = RNA_def_property(srna, "manipulator_handle_size", PROP_INT, PROP_PERCENTAGE);
 -      RNA_def_property_int_sdna(prop, NULL, "tw_handlesize");
 -      RNA_def_property_range(prop, 2, 40);
 -      RNA_def_property_int_default(prop, 25);
 -      RNA_def_property_ui_text(prop, "Manipulator Handle Size", "Size of manipulator handles as percentage of the radius");
 -      RNA_def_property_update(prop, 0, "rna_userdef_update");
 -
 -      prop = RNA_def_property(srna, "manipulator_hotspot", PROP_INT, PROP_PIXEL);
 -      RNA_def_property_int_sdna(prop, NULL, "tw_hotspot");
 -      RNA_def_property_range(prop, 4, 40);
 -      RNA_def_property_int_default(prop, 14);
 -      RNA_def_property_ui_text(prop, "Manipulator Hotspot", "Distance around the handles to accept mouse clicks");
 -
        prop = RNA_def_property(srna, "object_origin_size", PROP_INT, PROP_PIXEL);
        RNA_def_property_int_sdna(prop, NULL, "obcenter_dia");
        RNA_def_property_range(prop, 4, 10);
 -      RNA_def_property_ui_text(prop, "Object Origin Size", "Diameter in Pixels for Object/Lamp origin display");
 +      RNA_def_property_ui_text(prop, "Object Origin Size", "Diameter in Pixels for Object/Light origin display");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
        /* View2D Grid Displays */
@@@ -3838,14 -3680,6 +3838,14 @@@ static void rna_def_userdef_edit(Blende
        RNA_def_property_ui_text(prop, "Release confirms",
                                 "Moving things with a mouse drag confirms when releasing the button");
  
 +      prop = RNA_def_property(srna, "use_numeric_input_advanced", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_FLAG_NUMINPUT_ADVANCED);
 +      RNA_def_property_ui_text(
 +              prop, "Default to Advanced Numeric Input",
 +              "When entering numbers while transforming, "
 +              "default to advanced mode for full math expression evaluation");
 +
 +
        /* Undo */
        prop = RNA_def_property(srna, "undo_steps", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "undosteps");
        RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_ARM);
        RNA_def_property_ui_text(prop, "Duplicate Armature", "Causes armature data to be duplicated with the object");
  
 -      prop = RNA_def_property(srna, "use_duplicate_lamp", PROP_BOOLEAN, PROP_NONE);
 +      prop = RNA_def_property(srna, "use_duplicate_light", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_LAMP);
 -      RNA_def_property_ui_text(prop, "Duplicate Lamp", "Causes lamp data to be duplicated with the object");
 +      RNA_def_property_ui_text(prop, "Duplicate Light", "Causes light data to be duplicated with the object");
  
        prop = RNA_def_property(srna, "use_duplicate_material", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_MAT);
@@@ -4093,6 -3927,20 +4093,6 @@@ static void rna_def_userdef_system(Blen
                {0, NULL, 0, NULL, NULL}
        };
  
 -      static const EnumPropertyItem draw_method_items[] = {
 -              {USER_DRAW_AUTOMATIC, "AUTOMATIC", 0, "Automatic", "Automatically set based on graphics card and driver"},
 -              {USER_DRAW_TRIPLE, "TRIPLE_BUFFER", 0, "Triple Buffer",
 -                                 "Use a third buffer for minimal redraws at the cost of more memory"},
 -              {USER_DRAW_OVERLAP, "OVERLAP", 0, "Overlap",
 -                                  "Redraw all overlapping regions, minimal memory usage but more redraws"},
 -              {USER_DRAW_OVERLAP_FLIP, "OVERLAP_FLIP", 0, "Overlap Flip",
 -                                       "Redraw all overlapping regions, minimal memory usage but more redraws "
 -                                       "(for graphics drivers that do flipping)"},
 -              {USER_DRAW_FULL, "FULL", 0, "Full",
 -                               "Do a full redraw each time, slow, only use for reference or when everything else fails"},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
        static const EnumPropertyItem color_picker_types[] = {
                {USER_CP_CIRCLE_HSV, "CIRCLE_HSV", 0, "Circle (HSV)", "A circular Hue/Saturation color wheel, with Value slider"},
                {USER_CP_CIRCLE_HSL, "CIRCLE_HSL", 0, "Circle (HSL)", "A circular Hue/Saturation color wheel, with Lightness slider"},
            {0, NULL, 0, NULL, NULL}
        };
  
+       static const EnumPropertyItem text_hinting_items[] = {
+           {0, "AUTO", 0, "Auto", ""},
+           {USER_TEXT_HINTING_NONE, "NONE", 0, "None", ""},
+           {USER_TEXT_HINTING_SLIGHT, "SLIGHT", 0, "Slight", ""},
+           {USER_TEXT_HINTING_FULL, "FULL", 0, "Full", ""},
+           {0, NULL, 0, NULL, NULL}
+       };
        srna = RNA_def_struct(brna, "UserPreferencesSystem", NULL);
        RNA_def_struct_sdna(srna, "UserDef");
        RNA_def_struct_nested(brna, srna, "UserPreferences");
        RNA_def_property_ui_text(prop, "International Fonts", "Use international fonts");
        RNA_def_property_update(prop, NC_WINDOW, "rna_userdef_language_update");
  
 +      prop = RNA_def_property(srna, "ui_scale", PROP_FLOAT, PROP_NONE);
 +      RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 +      RNA_def_property_float_sdna(prop, NULL, "dpi_fac");
 +      RNA_def_property_ui_text(prop, "UI Scale",
 +                               "Size multiplier to use when drawing custom user interface elements, so that "
 +                               "they are scaled correctly on screens with different DPI. This value is based "
 +                               "on operating system DPI settings and Blender display scale");
 +
 +      prop = RNA_def_property(srna, "ui_line_width", PROP_FLOAT, PROP_NONE);
 +      RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 +      RNA_def_property_float_sdna(prop, NULL, "pixelsize");
 +      RNA_def_property_ui_text(prop, "UI Line Width",
 +                               "Suggested line thickness and point size in pixels, for add-ons drawing custom "
 +                               "user interface elements, based on operating system settings and Blender UI scale");
 +
        prop = RNA_def_property(srna, "dpi", PROP_INT, PROP_NONE);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 -      RNA_def_property_ui_text(prop, "DPI",
 -                               "DPI for add-ons to use when drawing custom user interface elements, controlled by "
 -                               "operating system settings and Blender UI scale, with a reference value of 72 DPI "
 -                               "(note that since this value includes a user defined scale, it is not always the "
 -                               "actual monitor DPI)");
  
        prop = RNA_def_property(srna, "pixel_size", PROP_FLOAT, PROP_NONE);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_float_sdna(prop, NULL, "pixelsize");
 -      RNA_def_property_ui_text(prop, "Pixel Size",
 -                               "Suggested line thickness and point size in pixels, for add-ons drawing custom user "
 -                               "interface elements, controlled by operating system settings and Blender UI scale");
  
        prop = RNA_def_property(srna, "font_path_ui", PROP_STRING, PROP_FILEPATH);
        RNA_def_property_string_sdna(prop, NULL, "font_path_ui");
        RNA_def_property_ui_text(prop, "Memory Cache Limit", "Memory cache limit (in megabytes)");
        RNA_def_property_update(prop, 0, "rna_Userdef_memcache_update");
  
 -      prop = RNA_def_property(srna, "frame_server_port", PROP_INT, PROP_NONE);
 -      RNA_def_property_int_sdna(prop, NULL, "frameserverport");
 -      RNA_def_property_range(prop, 0, 32727);
 -      RNA_def_property_ui_text(prop, "Frame Server Port", "Frameserver Port for Frameserver Rendering");
 -
        prop = RNA_def_property(srna, "gl_clip_alpha", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "glalphaclip");
        RNA_def_property_range(prop, 0.0f, 1.0f);
        RNA_def_property_ui_text(prop, "Clip Alpha", "Clip alpha below this threshold in the 3D textured view");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
 -      prop = RNA_def_property(srna, "use_mipmaps", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_negative_sdna(prop, NULL, "gameflags", USER_DISABLE_MIPMAP);
 -      RNA_def_property_ui_text(prop, "Mipmaps",
 -                               "Scale textures for the 3D View (looks nicer but uses more memory and slows image "
 -                               "reloading)");
 -      RNA_def_property_update(prop, 0, "rna_userdef_mipmap_update");
 -
        prop = RNA_def_property(srna, "use_16bit_textures", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "use_16bit_textures", 1);
        RNA_def_property_ui_text(prop, "16 Bit Float Textures", "Use 16 bit per component texture for float images");
        RNA_def_property_ui_text(prop, "Texture Collection Rate",
                                 "Number of seconds between each run of the GL texture garbage collector");
  
 -      prop = RNA_def_property(srna, "window_draw_method", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "wmdrawmethod");
 -      RNA_def_property_enum_items(prop, draw_method_items);
 -      RNA_def_property_ui_text(prop, "Window Draw Method", "Drawing method used by the window manager");
 -      RNA_def_property_update(prop, 0, "rna_userdef_dpi_update");
 -
        prop = RNA_def_property(srna, "audio_mixing_buffer", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "mixbufsize");
        RNA_def_property_enum_items(prop, audio_mixing_samples_items);
        RNA_def_property_ui_text(prop, "Text Anti-aliasing", "Draw user interface text anti-aliased");
        RNA_def_property_update(prop, 0, "rna_userdef_text_update");
  
-       prop = RNA_def_property(srna, "use_text_hinting", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_negative_sdna(prop, NULL, "text_render", USER_TEXT_DISABLE_HINTING);
-       RNA_def_property_ui_text(prop, "Text Hinting", "Draw user interface text with hinting");
+       prop = RNA_def_property(srna, "text_hinting", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_bitflag_sdna(prop, NULL, "text_render");
+       RNA_def_property_enum_items(prop, text_hinting_items);
+       RNA_def_property_ui_text(prop, "Text Hinting", "Method for making user interface text render sharp");
        RNA_def_property_update(prop, 0, "rna_userdef_text_update");
  
        prop = RNA_def_property(srna, "select_method", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_items(prop, multi_sample_levels);
        RNA_def_property_ui_text(prop, "MultiSample",
                                 "Enable OpenGL multi-sampling, only for systems that support it, requires restart");
 +      RNA_def_property_update(prop, 0, "rna_userdef_dpi_update");
 +
 +      /* grease pencil anti-aliasing */
 +      prop = RNA_def_property(srna, "gpencil_multi_sample", PROP_ENUM, PROP_NONE);
 +      RNA_def_property_enum_bitflag_sdna(prop, NULL, "gpencil_multisamples");
 +      RNA_def_property_enum_items(prop, multi_sample_levels);
 +      RNA_def_property_ui_text(prop, "Gpencil MultiSample",
 +              "Enable Grease Pencil OpenGL multi-sampling, only for systems that support it");
 +      RNA_def_property_update(prop, 0, "rna_userdef_dpi_update");
  
        prop = RNA_def_property(srna, "use_region_overlap", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "uiflag2", USER_REGION_OVERLAP);
                                 "Draw tool/property regions over the main region, when using Triple Buffer");
        RNA_def_property_update(prop, 0, "rna_userdef_dpi_update");
  
 +      prop = RNA_def_property(srna, "gpu_viewport_quality", PROP_FLOAT, PROP_FACTOR);
 +      RNA_def_property_float_sdna(prop, NULL, "gpu_viewport_quality");
 +      RNA_def_property_float_default(prop, 0.6f);
 +      RNA_def_property_range(prop, 0.0f, 1.0f);
 +      RNA_def_property_ui_text(prop, "Viewport Quality", "Quality setting for Solid mode rendering in the 3d viewport");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
 +
 +
  #ifdef WITH_OPENSUBDIV
        prop = RNA_def_property(srna, "opensubdiv_compute_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_flag(prop, PROP_ENUM_NO_CONTEXT);
@@@ -4853,7 -4704,6 +4862,7 @@@ void RNA_def_userdef(BlenderRNA *brna
                {USER_SECTION_INPUT, "INPUT", 0, "Input", ""},
                {USER_SECTION_ADDONS, "ADDONS", 0, "Add-ons", ""},
                {USER_SECTION_THEME, "THEMES", 0, "Themes", ""},
 +              {USER_SECTION_LIGHT, "LIGHTS", 0, "Lights", ""},
                {USER_SECTION_FILE, "FILES", 0, "File", ""},
                {USER_SECTION_SYSTEM, "SYSTEM", 0, "System", ""},
                {0, NULL, 0, NULL, NULL}
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_flag(prop, PROP_THICK_WRAP);
  
 +      /* StudioLight Collection */
 +      prop = RNA_def_property(srna, "studio_lights", PROP_COLLECTION, PROP_NONE);
 +      RNA_def_property_struct_type(prop, "StudioLight");
 +      RNA_def_property_srna(prop, "StudioLights");
 +      RNA_def_property_collection_funcs(
 +              prop, "rna_UserDef_studiolight_begin", "rna_iterator_listbase_next",
 +              "rna_iterator_listbase_end", "rna_iterator_listbase_get",
 +              NULL, NULL, NULL, NULL);
 +      RNA_def_property_ui_text(prop, "Studio Lights", "");
 +
        rna_def_userdef_view(brna);
        rna_def_userdef_edit(brna);
        rna_def_userdef_input(brna);
        rna_def_userdef_system(brna);
        rna_def_userdef_addon(brna);
        rna_def_userdef_addon_pref(brna);
 +      rna_def_userdef_studiolights(brna);
 +      rna_def_userdef_studiolight(brna);
        rna_def_userdef_pathcompare(brna);
  
  }