roundedbox: Clamp border radius to box size
Note that clamping in rounded_box_grow() is not necessary as that function cannot lead to overlap unless the rounded box was overlapping previously. https://bugzilla.gnome.org/show_bug.cgi?id=655009
This commit is contained in:
		
				
					committed by
					
						
						Benjamin Otte
					
				
			
			
				
	
			
			
			
						parent
						
							a02b82056a
						
					
				
				
					commit
					b3f03d092f
				
			@ -48,6 +48,32 @@ _gtk_rounded_box_init_rect (GtkRoundedBox *box,
 | 
				
			|||||||
  memset (&box->border_radius, 0, sizeof (GtkCssBorderRadius));
 | 
					  memset (&box->border_radius, 0, sizeof (GtkCssBorderRadius));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* clamp border radius, following CSS specs */
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					gtk_rounded_box_clamp_border_radius (GtkRoundedBox *box)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  gdouble factor = 1.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* note: division by zero leads to +INF, which is > factor, so will be ignored */
 | 
				
			||||||
 | 
					  factor = MIN (factor, box->box.width / (box->border_radius.top_left.horizontal +
 | 
				
			||||||
 | 
					                                          box->border_radius.top_right.horizontal));
 | 
				
			||||||
 | 
					  factor = MIN (factor, box->box.height / (box->border_radius.top_right.vertical +
 | 
				
			||||||
 | 
					                                           box->border_radius.bottom_right.vertical));
 | 
				
			||||||
 | 
					  factor = MIN (factor, box->box.width / (box->border_radius.bottom_right.horizontal +
 | 
				
			||||||
 | 
					                                          box->border_radius.bottom_left.horizontal));
 | 
				
			||||||
 | 
					  factor = MIN (factor, box->box.height / (box->border_radius.top_left.vertical +
 | 
				
			||||||
 | 
					                                           box->border_radius.bottom_left.vertical));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  box->border_radius.top_left.horizontal *= factor;
 | 
				
			||||||
 | 
					  box->border_radius.top_left.vertical *= factor;
 | 
				
			||||||
 | 
					  box->border_radius.top_right.horizontal *= factor;
 | 
				
			||||||
 | 
					  box->border_radius.top_right.vertical *= factor;
 | 
				
			||||||
 | 
					  box->border_radius.bottom_right.horizontal *= factor;
 | 
				
			||||||
 | 
					  box->border_radius.bottom_right.vertical *= factor;
 | 
				
			||||||
 | 
					  box->border_radius.bottom_left.horizontal *= factor;
 | 
				
			||||||
 | 
					  box->border_radius.bottom_left.vertical *= factor;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
_gtk_rounded_box_apply_border_radius (GtkRoundedBox    *box,
 | 
					_gtk_rounded_box_apply_border_radius (GtkRoundedBox    *box,
 | 
				
			||||||
                                      GtkThemingEngine *engine,
 | 
					                                      GtkThemingEngine *engine,
 | 
				
			||||||
@ -75,6 +101,8 @@ _gtk_rounded_box_apply_border_radius (GtkRoundedBox    *box,
 | 
				
			|||||||
  if (bottom_left_radius && (junction & GTK_JUNCTION_CORNER_BOTTOMLEFT) == 0)
 | 
					  if (bottom_left_radius && (junction & GTK_JUNCTION_CORNER_BOTTOMLEFT) == 0)
 | 
				
			||||||
    box->border_radius.bottom_left = *bottom_left_radius;
 | 
					    box->border_radius.bottom_left = *bottom_left_radius;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  gtk_rounded_box_clamp_border_radius (box);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  g_free (top_left_radius);
 | 
					  g_free (top_left_radius);
 | 
				
			||||||
  g_free (top_right_radius);
 | 
					  g_free (top_right_radius);
 | 
				
			||||||
  g_free (bottom_right_radius);
 | 
					  g_free (bottom_right_radius);
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user