@ -656,7 +656,13 @@ void ImDrawList::PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, c
_IdxWritePtr + = 6 ;
}
// On AddPolyline() and AddConvexPolyFilled() we intentionally avoid using ImVec2 and superflous function calls to optimize debug/non-inlined builds.
// Those macros expects l-values.
# define IM_NORMALIZE2F_OVER_ZERO(VX,VY) { float d2 = VX*VX + VY*VY; if (d2 > 0.0f) { float inv_len = 1.0f / ImSqrt(d2); VX *= inv_len; VY *= inv_len; } }
# define IM_NORMALIZE2F_OVER_EPSILON_CLAMP(VX,VY,EPS,INVLENMAX) { float d2 = VX*VX + VY*VY; if (d2 > EPS) { float inv_len = 1.0f / ImSqrt(d2); if (inv_len > INVLENMAX) inv_len = INVLENMAX; VX *= inv_len; VY *= inv_len; } }
// TODO: Thickness anti-aliased lines cap are missing their AA fringe.
// We avoid using the ImVec2 math operators here to reduce cost to a minimum for debug/non-inlined builds.
void ImDrawList : : AddPolyline ( const ImVec2 * points , const int points_count , ImU32 col , bool closed , float thickness )
{
if ( points_count < 2 )
@ -686,10 +692,11 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
for ( int i1 = 0 ; i1 < count ; i1 + + )
{
const int i2 = ( i1 + 1 ) = = points_count ? 0 : i1 + 1 ;
ImVec2 diff = points [ i2 ] - points [ i1 ] ;
diff * = ImInvLength ( diff , 1.0f ) ;
temp_normals [ i1 ] . x = diff . y ;
temp_normals [ i1 ] . y = - diff . x ;
float dx = points [ i2 ] . x - points [ i1 ] . x ;
float dy = points [ i2 ] . y - points [ i1 ] . y ;
IM_NORMALIZE2F_OVER_ZERO ( dx , dy ) ;
temp_normals [ i1 ] . x = dy ;
temp_normals [ i1 ] . y = - dx ;
}
if ( ! closed )
temp_normals [ points_count - 1 ] = temp_normals [ points_count - 2 ] ;
@ -712,17 +719,18 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
unsigned int idx2 = ( i1 + 1 ) = = points_count ? _VtxCurrentIdx : idx1 + 3 ;
// Average normals
ImVec2 dm = ( temp_normals [ i1 ] + temp_normals [ i2 ] ) * 0.5f ;
float dmr2 = dm . x * dm . x + dm . y * dm . y ;
if ( dmr2 > 0.000001f )
{
float scale = 1.0f / dmr2 ;
if ( scale > 100.0f ) scale = 100.0f ;
dm * = scale ;
}
dm * = AA_SIZE ;
temp_points [ i2 * 2 + 0 ] = points [ i2 ] + dm ;
temp_points [ i2 * 2 + 1 ] = points [ i2 ] - dm ;
float dm_x = ( temp_normals [ i1 ] . x + temp_normals [ i2 ] . x ) * 0.5f ;
float dm_y = ( temp_normals [ i1 ] . y + temp_normals [ i2 ] . y ) * 0.5f ;
IM_NORMALIZE2F_OVER_EPSILON_CLAMP ( dm_x , dm_y , 0.000001f , 100.0f )
dm_x * = AA_SIZE ;
dm_y * = AA_SIZE ;
// Add temporary vertexes
ImVec2 * out_vtx = & temp_points [ i2 * 2 ] ;
out_vtx [ 0 ] . x = points [ i2 ] . x + dm_x ;
out_vtx [ 0 ] . y = points [ i2 ] . y + dm_y ;
out_vtx [ 1 ] . x = points [ i2 ] . x - dm_x ;
out_vtx [ 1 ] . y = points [ i2 ] . y - dm_y ;
// Add indexes
_IdxWritePtr [ 0 ] = ( ImDrawIdx ) ( idx2 + 0 ) ; _IdxWritePtr [ 1 ] = ( ImDrawIdx ) ( idx1 + 0 ) ; _IdxWritePtr [ 2 ] = ( ImDrawIdx ) ( idx1 + 2 ) ;
@ -766,20 +774,24 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
unsigned int idx2 = ( i1 + 1 ) = = points_count ? _VtxCurrentIdx : idx1 + 4 ;
// Average normals
ImVec2 dm = ( temp_normals [ i1 ] + temp_normals [ i2 ] ) * 0.5f ;
float dmr2 = dm . x * dm . x + dm . y * dm . y ;
if ( dmr2 > 0.000001f )
{
float scale = 1.0f / dmr2 ;
if ( scale > 100.0f ) scale = 100.0f ;
dm * = scale ;
}
ImVec2 dm_out = dm * ( half_inner_thickness + AA_SIZE ) ;
ImVec2 dm_in = dm * half_inner_thickness ;
temp_points [ i2 * 4 + 0 ] = points [ i2 ] + dm_out ;
temp_points [ i2 * 4 + 1 ] = points [ i2 ] + dm_in ;
temp_points [ i2 * 4 + 2 ] = points [ i2 ] - dm_in ;
temp_points [ i2 * 4 + 3 ] = points [ i2 ] - dm_out ;
float dm_x = ( temp_normals [ i1 ] . x + temp_normals [ i2 ] . x ) * 0.5f ;
float dm_y = ( temp_normals [ i1 ] . y + temp_normals [ i2 ] . y ) * 0.5f ;
IM_NORMALIZE2F_OVER_EPSILON_CLAMP ( dm_x , dm_y , 0.000001f , 100.0f ) ;
float dm_out_x = dm_x * ( half_inner_thickness + AA_SIZE ) ;
float dm_out_y = dm_y * ( half_inner_thickness + AA_SIZE ) ;
float dm_in_x = dm_x * half_inner_thickness ;
float dm_in_y = dm_y * half_inner_thickness ;
// Add temporary vertexes
ImVec2 * out_vtx = & temp_points [ i2 * 4 ] ;
out_vtx [ 0 ] . x = points [ i2 ] . x + dm_out_x ;
out_vtx [ 0 ] . y = points [ i2 ] . y + dm_out_y ;
out_vtx [ 1 ] . x = points [ i2 ] . x + dm_in_x ;
out_vtx [ 1 ] . y = points [ i2 ] . y + dm_in_y ;
out_vtx [ 2 ] . x = points [ i2 ] . x - dm_in_x ;
out_vtx [ 2 ] . y = points [ i2 ] . y - dm_in_y ;
out_vtx [ 3 ] . x = points [ i2 ] . x - dm_out_x ;
out_vtx [ 3 ] . y = points [ i2 ] . y - dm_out_y ;
// Add indexes
_IdxWritePtr [ 0 ] = ( ImDrawIdx ) ( idx2 + 1 ) ; _IdxWritePtr [ 1 ] = ( ImDrawIdx ) ( idx1 + 1 ) ; _IdxWritePtr [ 2 ] = ( ImDrawIdx ) ( idx1 + 2 ) ;
@ -817,11 +829,13 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
const int i2 = ( i1 + 1 ) = = points_count ? 0 : i1 + 1 ;
const ImVec2 & p1 = points [ i1 ] ;
const ImVec2 & p2 = points [ i2 ] ;
ImVec2 diff = p2 - p1 ;
diff * = ImInvLength ( diff , 1.0f ) ;
const float dx = diff . x * ( thickness * 0.5f ) ;
const float dy = diff . y * ( thickness * 0.5f ) ;
float dx = p2 . x - p1 . x ;
float dy = p2 . y - p1 . y ;
IM_NORMALIZE2F_OVER_ZERO ( dx , dy ) ;
dx * = ( thickness * 0.5f ) ;
dy * = ( thickness * 0.5f ) ;
_VtxWritePtr [ 0 ] . pos . x = p1 . x + dy ; _VtxWritePtr [ 0 ] . pos . y = p1 . y - dx ; _VtxWritePtr [ 0 ] . uv = uv ; _VtxWritePtr [ 0 ] . col = col ;
_VtxWritePtr [ 1 ] . pos . x = p2 . x + dy ; _VtxWritePtr [ 1 ] . pos . y = p2 . y - dx ; _VtxWritePtr [ 1 ] . uv = uv ; _VtxWritePtr [ 1 ] . col = col ;
_VtxWritePtr [ 2 ] . pos . x = p2 . x - dy ; _VtxWritePtr [ 2 ] . pos . y = p2 . y + dx ; _VtxWritePtr [ 2 ] . uv = uv ; _VtxWritePtr [ 2 ] . col = col ;
@ -836,6 +850,7 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
}
}
// We intentionally avoid using ImVec2 and its math operators here to reduce cost to a minimum for debug/non-inlined builds.
void ImDrawList : : AddConvexPolyFilled ( const ImVec2 * points , const int points_count , ImU32 col )
{
if ( points_count < 3 )
@ -867,10 +882,11 @@ void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_coun
{
const ImVec2 & p0 = points [ i0 ] ;
const ImVec2 & p1 = points [ i1 ] ;
ImVec2 diff = p1 - p0 ;
diff * = ImInvLength ( diff , 1.0f ) ;
temp_normals [ i0 ] . x = diff . y ;
temp_normals [ i0 ] . y = - diff . x ;
float dx = p1 . x - p0 . x ;
float dy = p1 . y - p0 . y ;
IM_NORMALIZE2F_OVER_ZERO ( dx , dy ) ;
temp_normals [ i0 ] . x = dy ;
temp_normals [ i0 ] . y = - dx ;
}
for ( int i0 = points_count - 1 , i1 = 0 ; i1 < points_count ; i0 = i1 + + )
@ -878,19 +894,15 @@ void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_coun
// Average normals
const ImVec2 & n0 = temp_normals [ i0 ] ;
const ImVec2 & n1 = temp_normals [ i1 ] ;
ImVec2 dm = ( n0 + n1 ) * 0.5f ;
float dmr2 = dm . x * dm . x + dm . y * dm . y ;
if ( dmr2 > 0.000001f )
{
float scale = 1.0f / dmr2 ;
if ( scale > 100.0f ) scale = 100.0f ;
dm * = scale ;
}
dm * = AA_SIZE * 0.5f ;
float dm_x = ( n0 . x + n1 . x ) * 0.5f ;
float dm_y = ( n0 . y + n1 . y ) * 0.5f ;
IM_NORMALIZE2F_OVER_EPSILON_CLAMP ( dm_x , dm_y , 0.000001f , 100.0f ) ;
dm_x * = AA_SIZE * 0.5f ;
dm_y * = AA_SIZE * 0.5f ;
// Add vertices
_VtxWritePtr [ 0 ] . pos = ( points [ i1 ] - dm ) ; _VtxWritePtr [ 0 ] . uv = uv ; _VtxWritePtr [ 0 ] . col = col ; // Inner
_VtxWritePtr [ 1 ] . pos = ( points [ i1 ] + dm ) ; _VtxWritePtr [ 1 ] . uv = uv ; _VtxWritePtr [ 1 ] . col = col_trans ; // Outer
_VtxWritePtr [ 0 ] . pos . x = ( points [ i1 ] . x - dm_x ) ; _VtxWritePtr [ 0 ] . pos . y = ( points [ i1 ] . y - dm_y ) ; _VtxWritePtr [ 0 ] . uv = uv ; _VtxWritePtr [ 0 ] . col = col ; // Inner
_VtxWritePtr [ 1 ] . pos . x = ( points [ i1 ] . x + dm_x ) ; _VtxWritePtr [ 1 ] . pos . y = ( points [ i1 ] . y + dm_y ) ; _VtxWritePtr [ 1 ] . uv = uv ; _VtxWritePtr [ 1 ] . col = col_trans ; // Outer
_VtxWritePtr + = 2 ;
// Add indexes for fringes
@ -2422,7 +2434,7 @@ const ImFontGlyph* ImFont::FindGlyph(ImWchar c) const
{
if ( c > = IndexLookup . Size )
return FallbackGlyph ;
const ImWchar i = IndexLookup [c ] ;
const ImWchar i = IndexLookup .Data [c ] ;
if ( i = = ( ImWchar ) - 1 )
return FallbackGlyph ;
return & Glyphs . Data [ i ] ;
@ -2432,7 +2444,7 @@ const ImFontGlyph* ImFont::FindGlyphNoFallback(ImWchar c) const
{
if ( c > = IndexLookup . Size )
return NULL ;
const ImWchar i = IndexLookup [c ] ;
const ImWchar i = IndexLookup .Data [c ] ;
if ( i = = ( ImWchar ) - 1 )
return NULL ;
return & Glyphs . Data [ i ] ;
@ -2492,7 +2504,7 @@ const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const c
}
}
const float char_width = ( ( int ) c < IndexAdvanceX . Size ? IndexAdvanceX [( int ) c ] : FallbackAdvanceX ) ;
const float char_width = ( ( int ) c < IndexAdvanceX . Size ? IndexAdvanceX .Data [ c ] : FallbackAdvanceX ) ;
if ( ImCharIsBlankW ( c ) )
{
if ( inside_word )
@ -2609,7 +2621,7 @@ ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, cons
continue ;
}
const float char_width = ( ( int ) c < IndexAdvanceX . Size ? IndexAdvanceX [( int ) c ] : FallbackAdvanceX ) * scale ;
const float char_width = ( ( int ) c < IndexAdvanceX . Size ? IndexAdvanceX .Data [ c ] : FallbackAdvanceX ) * scale ;
if ( line_width + char_width > = max_width )
{
s = prev_s ;