[Bf-blender-cvs] [537c57136fc] blender-v2.90-release: Fix T79254: FCurve editor crash when zooming out to limit

Campbell Barton noreply at git.blender.org
Sat Jul 25 12:33:03 CEST 2020


Commit: 537c57136fc1b98dc46c5108e4d152452e74350d
Author: Campbell Barton
Date:   Sat Jul 25 20:23:06 2020 +1000
Branches: blender-v2.90-release
https://developer.blender.org/rB537c57136fc1b98dc46c5108e4d152452e74350d

Fix T79254: FCurve editor crash when zooming out to limit

===================================================================

M	source/blender/editors/interface/view2d_draw.c

===================================================================

diff --git a/source/blender/editors/interface/view2d_draw.c b/source/blender/editors/interface/view2d_draw.c
index 0108dafc531..54b25939baf 100644
--- a/source/blender/editors/interface/view2d_draw.c
+++ b/source/blender/editors/interface/view2d_draw.c
@@ -174,26 +174,38 @@ static void get_parallel_lines_draw_steps(const ParallelLinesSet *lines,
   }
 }
 
+/**
+ * \param rect_mask: Region size in pixels.
+ */
 static void draw_parallel_lines(const ParallelLinesSet *lines,
                                 const rctf *rect,
-                                const uchar *color,
+                                const rcti *rect_mask,
+                                const uchar color[3],
                                 char direction)
 {
   float first;
-  uint steps;
+  uint steps, steps_max;
 
   if (direction == 'v') {
     get_parallel_lines_draw_steps(lines, rect->xmin, rect->xmax, &first, &steps);
+    steps_max = BLI_rcti_size_x(rect_mask);
   }
   else {
     BLI_assert(direction == 'h');
     get_parallel_lines_draw_steps(lines, rect->ymin, rect->ymax, &first, &steps);
+    steps_max = BLI_rcti_size_y(rect_mask);
   }
 
   if (steps == 0) {
     return;
   }
 
+  if (UNLIKELY(steps >= steps_max)) {
+    /* Note that we could draw a solid color,
+     * however this flickers because of numeric instability when zoomed out. */
+    return;
+  }
+
   GPUVertFormat *format = immVertexFormat();
   uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
 
@@ -234,12 +246,12 @@ static void draw_parallel_lines(const ParallelLinesSet *lines,
 
 static void view2d_draw_lines_internal(const View2D *v2d,
                                        const ParallelLinesSet *lines,
-                                       const uchar *color,
+                                       const uchar color[3],
                                        char direction)
 {
   GPU_matrix_push_projection();
   UI_view2d_view_ortho(v2d);
-  draw_parallel_lines(lines, &v2d->cur, color, direction);
+  draw_parallel_lines(lines, &v2d->cur, &v2d->mask, color, direction);
   GPU_matrix_pop_projection();
 }
 
@@ -248,17 +260,18 @@ static void view2d_draw_lines(const View2D *v2d,
                               bool display_minor_lines,
                               char direction)
 {
-  uchar major_color[3];
-  uchar minor_color[3];
-  UI_GetThemeColor3ubv(TH_GRID, major_color);
-  UI_GetThemeColorShade3ubv(TH_GRID, 16, minor_color);
-
-  ParallelLinesSet major_lines;
-  major_lines.distance = major_distance;
-  major_lines.offset = 0;
-  view2d_draw_lines_internal(v2d, &major_lines, major_color, direction);
+  {
+    uchar major_color[3];
+    UI_GetThemeColor3ubv(TH_GRID, major_color);
+    ParallelLinesSet major_lines;
+    major_lines.distance = major_distance;
+    major_lines.offset = 0;
+    view2d_draw_lines_internal(v2d, &major_lines, major_color, direction);
+  }
 
   if (display_minor_lines) {
+    uchar minor_color[3];
+    UI_GetThemeColorShade3ubv(TH_GRID, 16, minor_color);
     ParallelLinesSet minor_lines;
     minor_lines.distance = major_distance;
     minor_lines.offset = major_distance / 2.0f;
@@ -284,9 +297,6 @@ static void draw_horizontal_scale_indicators(const ARegion *region,
     return;
   }
 
-  GPU_matrix_push_projection();
-  wmOrtho2_region_pixelspace(region);
-
   float start;
   uint steps;
   {
@@ -298,8 +308,15 @@ static void draw_horizontal_scale_indicators(const ARegion *region,
                                   UI_view2d_region_to_view_x(v2d, rect->xmax),
                                   &start,
                                   &steps);
+    const uint steps_max = BLI_rcti_size_x(&v2d->mask);
+    if (UNLIKELY(steps >= steps_max)) {
+      return;
+    }
   }
 
+  GPU_matrix_push_projection();
+  wmOrtho2_region_pixelspace(region);
+
   const int font_id = BLF_default();
   UI_FontThemeColor(font_id, colorid);
 
@@ -339,9 +356,6 @@ static void draw_vertical_scale_indicators(const ARegion *region,
     return;
   }
 
-  GPU_matrix_push_projection();
-  wmOrtho2_region_pixelspace(region);
-
   float start;
   uint steps;
   {
@@ -353,8 +367,15 @@ static void draw_vertical_scale_indicators(const ARegion *region,
                                   UI_view2d_region_to_view_y(v2d, rect->ymax),
                                   &start,
                                   &steps);
+    const uint steps_max = BLI_rcti_size_y(&v2d->mask);
+    if (UNLIKELY(steps >= steps_max)) {
+      return;
+    }
   }
 
+  GPU_matrix_push_projection();
+  wmOrtho2_region_pixelspace(region);
+
   const int font_id = BLF_default();
   UI_FontThemeColor(font_id, colorid);



More information about the Bf-blender-cvs mailing list