mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-07 14:53:35 +00:00
rlottie/vector: backport optimization from freetype
This commit is contained in:
parent
75f9d3ff29
commit
c77c7b320f
@ -441,16 +441,17 @@ void SW_FT_Vector_From_Polar(SW_FT_Vector* vec, SW_FT_Fixed length,
|
||||
|
||||
/* documentation is in fttrigon.h */
|
||||
|
||||
SW_FT_Angle SW_FT_Angle_Diff(SW_FT_Angle angle1, SW_FT_Angle angle2)
|
||||
SW_FT_Angle SW_FT_Angle_Diff( SW_FT_Angle angle1, SW_FT_Angle angle2 )
|
||||
{
|
||||
SW_FT_Angle delta = angle2 - angle1;
|
||||
SW_FT_Angle delta = angle2 - angle1;
|
||||
|
||||
delta %= SW_FT_ANGLE_2PI;
|
||||
if (delta < 0) delta += SW_FT_ANGLE_2PI;
|
||||
while ( delta <= -SW_FT_ANGLE_PI )
|
||||
delta += SW_FT_ANGLE_2PI;
|
||||
|
||||
if (delta > SW_FT_ANGLE_PI) delta -= SW_FT_ANGLE_2PI;
|
||||
while ( delta > SW_FT_ANGLE_PI )
|
||||
delta -= SW_FT_ANGLE_2PI;
|
||||
|
||||
return delta;
|
||||
return delta;
|
||||
}
|
||||
|
||||
/* END */
|
||||
|
||||
@ -637,19 +637,21 @@ End:
|
||||
|
||||
static void gray_split_conic(SW_FT_Vector* base)
|
||||
{
|
||||
TPos a, b;
|
||||
TPos a, b;
|
||||
|
||||
base[4].x = base[2].x;
|
||||
b = base[1].x;
|
||||
a = base[3].x = (base[2].x + b) / 2;
|
||||
b = base[1].x = (base[0].x + b) / 2;
|
||||
base[2].x = (a + b) / 2;
|
||||
a = base[0].x + base[1].x;
|
||||
b = base[1].x + base[2].x;
|
||||
base[3].x = b >> 1;
|
||||
base[2].x = ( a + b ) >> 2;
|
||||
base[1].x = a >> 1;
|
||||
|
||||
base[4].y = base[2].y;
|
||||
b = base[1].y;
|
||||
a = base[3].y = (base[2].y + b) / 2;
|
||||
b = base[1].y = (base[0].y + b) / 2;
|
||||
base[2].y = (a + b) / 2;
|
||||
a = base[0].y + base[1].y;
|
||||
b = base[1].y + base[2].y;
|
||||
base[3].y = b >> 1;
|
||||
base[2].y = ( a + b ) >> 2;
|
||||
base[1].y = a >> 1;
|
||||
}
|
||||
|
||||
static void gray_render_conic(RAS_ARG_ const SW_FT_Vector* control,
|
||||
@ -719,27 +721,32 @@ static void gray_render_conic(RAS_ARG_ const SW_FT_Vector* control,
|
||||
|
||||
static void gray_split_cubic(SW_FT_Vector* base)
|
||||
{
|
||||
TPos a, b, c, d;
|
||||
TPos a, b, c;
|
||||
|
||||
|
||||
base[6].x = base[3].x;
|
||||
c = base[1].x;
|
||||
d = base[2].x;
|
||||
base[1].x = a = (base[0].x + c) / 2;
|
||||
base[5].x = b = (base[3].x + d) / 2;
|
||||
c = (c + d) / 2;
|
||||
base[2].x = a = (a + c) / 2;
|
||||
base[4].x = b = (b + c) / 2;
|
||||
base[3].x = (a + b) / 2;
|
||||
a = base[0].x + base[1].x;
|
||||
b = base[1].x + base[2].x;
|
||||
c = base[2].x + base[3].x;
|
||||
base[5].x = c >> 1;
|
||||
c += b;
|
||||
base[4].x = c >> 2;
|
||||
base[1].x = a >> 1;
|
||||
a += b;
|
||||
base[2].x = a >> 2;
|
||||
base[3].x = ( a + c ) >> 3;
|
||||
|
||||
base[6].y = base[3].y;
|
||||
c = base[1].y;
|
||||
d = base[2].y;
|
||||
base[1].y = a = (base[0].y + c) / 2;
|
||||
base[5].y = b = (base[3].y + d) / 2;
|
||||
c = (c + d) / 2;
|
||||
base[2].y = a = (a + c) / 2;
|
||||
base[4].y = b = (b + c) / 2;
|
||||
base[3].y = (a + b) / 2;
|
||||
a = base[0].y + base[1].y;
|
||||
b = base[1].y + base[2].y;
|
||||
c = base[2].y + base[3].y;
|
||||
base[5].y = c >> 1;
|
||||
c += b;
|
||||
base[4].y = c >> 2;
|
||||
base[1].y = a >> 1;
|
||||
a += b;
|
||||
base[2].y = a >> 2;
|
||||
base[3].y = ( a + c ) >> 3;
|
||||
}
|
||||
|
||||
static void gray_render_cubic(RAS_ARG_ const SW_FT_Vector* control1,
|
||||
|
||||
@ -47,16 +47,18 @@ static void ft_conic_split(SW_FT_Vector* base)
|
||||
SW_FT_Pos a, b;
|
||||
|
||||
base[4].x = base[2].x;
|
||||
b = base[1].x;
|
||||
a = base[3].x = (base[2].x + b) / 2;
|
||||
b = base[1].x = (base[0].x + b) / 2;
|
||||
base[2].x = (a + b) / 2;
|
||||
a = base[0].x + base[1].x;
|
||||
b = base[1].x + base[2].x;
|
||||
base[3].x = b >> 1;
|
||||
base[2].x = ( a + b ) >> 2;
|
||||
base[1].x = a >> 1;
|
||||
|
||||
base[4].y = base[2].y;
|
||||
b = base[1].y;
|
||||
a = base[3].y = (base[2].y + b) / 2;
|
||||
b = base[1].y = (base[0].y + b) / 2;
|
||||
base[2].y = (a + b) / 2;
|
||||
a = base[0].y + base[1].y;
|
||||
b = base[1].y + base[2].y;
|
||||
base[3].y = b >> 1;
|
||||
base[2].y = ( a + b ) >> 2;
|
||||
base[1].y = a >> 1;
|
||||
}
|
||||
|
||||
static SW_FT_Bool ft_conic_is_small_enough(SW_FT_Vector* base,
|
||||
@ -99,27 +101,31 @@ static SW_FT_Bool ft_conic_is_small_enough(SW_FT_Vector* base,
|
||||
|
||||
static void ft_cubic_split(SW_FT_Vector* base)
|
||||
{
|
||||
SW_FT_Pos a, b, c, d;
|
||||
SW_FT_Pos a, b, c;
|
||||
|
||||
base[6].x = base[3].x;
|
||||
c = base[1].x;
|
||||
d = base[2].x;
|
||||
base[1].x = a = (base[0].x + c) / 2;
|
||||
base[5].x = b = (base[3].x + d) / 2;
|
||||
c = (c + d) / 2;
|
||||
base[2].x = a = (a + c) / 2;
|
||||
base[4].x = b = (b + c) / 2;
|
||||
base[3].x = (a + b) / 2;
|
||||
a = base[0].x + base[1].x;
|
||||
b = base[1].x + base[2].x;
|
||||
c = base[2].x + base[3].x;
|
||||
base[5].x = c >> 1;
|
||||
c += b;
|
||||
base[4].x = c >> 2;
|
||||
base[1].x = a >> 1;
|
||||
a += b;
|
||||
base[2].x = a >> 2;
|
||||
base[3].x = ( a + c ) >> 3;
|
||||
|
||||
base[6].y = base[3].y;
|
||||
c = base[1].y;
|
||||
d = base[2].y;
|
||||
base[1].y = a = (base[0].y + c) / 2;
|
||||
base[5].y = b = (base[3].y + d) / 2;
|
||||
c = (c + d) / 2;
|
||||
base[2].y = a = (a + c) / 2;
|
||||
base[4].y = b = (b + c) / 2;
|
||||
base[3].y = (a + b) / 2;
|
||||
a = base[0].y + base[1].y;
|
||||
b = base[1].y + base[2].y;
|
||||
c = base[2].y + base[3].y;
|
||||
base[5].y = c >> 1;
|
||||
c += b;
|
||||
base[4].y = c >> 2;
|
||||
base[1].y = a >> 1;
|
||||
a += b;
|
||||
base[2].y = a >> 2;
|
||||
base[3].y = ( a + c ) >> 3;
|
||||
}
|
||||
|
||||
/* Return the average of `angle1' and `angle2'. */
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user