Add preload support in smooth

gsoc-anurag-2023
Anurag Thakur 1 year ago
parent 012a28c055
commit 78df2b651f
  1. 1
      include/freetype/freetype.h
  2. 2
      modules.cfg
  3. 8
      src/base/ftobjs.c
  4. 31
      src/smooth/ftgrays.c
  5. 23
      src/smooth/ftsmooth.c

@ -2298,6 +2298,7 @@ FT_BEGIN_HEADER
void* other;
FT_PreLine prelines;
int prel_shifted;
FT_Slot_Internal internal;

@ -100,7 +100,7 @@ HINTING_MODULES += pshinter
####
# Dense Rasterizer
RASTER_MODULES += dense
#RASTER_MODULES += dense
# Anti-aliasing rasterizer.
RASTER_MODULES += smooth

@ -579,6 +579,7 @@
{
/* free bitmap if needed */
ft_glyphslot_free_bitmap( slot );
/* clear all public fields in the glyph slot */
slot->glyph_index = 0;
@ -1180,6 +1181,8 @@
}
#ifdef FT_DEBUG_LEVEL_TRACE
FT_TRACE5(( "FT_Load_Glyph: index %d, flags 0x%x\n",
glyph_index, load_flags ));
@ -2645,7 +2648,7 @@ int conic_to2(FT_GlyphSlot* slot, FT_Vector *control, FT_Vector *from, FT_Vector
}
static FT_Error ft_decompose_outline(FT_GlyphSlot* slot){
FT_Error ft_decompose_outline(FT_GlyphSlot* slot){
FT_Vector v_last;
FT_Vector v_control;
FT_Vector v_start;
@ -3138,7 +3141,7 @@ int conic_to2(FT_GlyphSlot* slot, FT_Vector *control, FT_Vector *from, FT_Vector
face->garray = (FT_GlyphSlot*)malloc(
face->driver->clazz->slot_object_size * face->num_glyphs );
//error = FT_Set_Char_Size( face, 0, 160 * 64, 300, 300 );
error = FT_Set_Pixel_Sizes( face, 0, 500);
error = FT_Set_Pixel_Sizes( face, 0, 100);
// int glyph_index = FT_Get_Char_Index( face, 'A' );
// error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_HINTING );
@ -3150,6 +3153,7 @@ int conic_to2(FT_GlyphSlot* slot, FT_Vector *control, FT_Vector *from, FT_Vector
FT_ALLOC(face->garray[gindex], clazz->slot_object_size);
face->garray[gindex]->face = face;
face->garray[gindex]->prel_shifted = 0;
face->garray[gindex]->glyph_index = gindex;
ft_glyphslot_init(face->garray[gindex]);
face->garray[gindex]->next = NULL;

@ -1921,7 +1921,7 @@ typedef ptrdiff_t FT_PtrDist;
static int
gray_convert_glyph_inner( RAS_ARG_
int continued )
int continued , FT_PreLine pl)
{
volatile int error;
@ -1930,7 +1930,28 @@ typedef ptrdiff_t FT_PtrDist;
{
if ( continued )
FT_Trace_Disable();
error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras );
//error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras );
FT_Vector point1 = {pl->x1, pl->y1};
FT_Vector point2 = {100, 100};
error = gray_move_to(&point1, worker);
while (pl!=NULL)
{
point1.x = pl->x1;
point1.y = pl->y1;
point2.x = pl->x2;
point2.y = pl->y2;
if(pl->ismove){
gray_move_to(&point2, worker);
}else{
gray_line_to(&point2, worker);
}
pl= pl->next;
}
if ( continued )
FT_Trace_Enable();
@ -1953,7 +1974,7 @@ typedef ptrdiff_t FT_PtrDist;
static int
gray_convert_glyph( RAS_ARG )
gray_convert_glyph( RAS_ARG , FT_PreLine pl)
{
const TCoord yMin = ras.min_ey;
const TCoord yMax = ras.max_ey;
@ -2015,7 +2036,7 @@ typedef ptrdiff_t FT_PtrDist;
ras.max_ey = band[0];
ras.count_ey = width;
error = gray_convert_glyph_inner( RAS_VAR_ continued );
error = gray_convert_glyph_inner( RAS_VAR_ continued, pl );
continued = 1;
if ( !error )
@ -2132,7 +2153,7 @@ typedef ptrdiff_t FT_PtrDist;
if ( ras.max_ex <= ras.min_ex || ras.max_ey <= ras.min_ey )
return Smooth_Err_Ok;
return gray_convert_glyph( RAS_VAR );
return gray_convert_glyph( RAS_VAR, params->prelines );
}

@ -501,8 +501,20 @@
}
/* translate outline to render it into the bitmap */
if ( x_shift || y_shift )
FT_Outline_Translate( outline, x_shift, y_shift );
if ( (x_shift || y_shift) && !slot->prel_shifted){
//FT_Outline_Translate( outline, x_shift, y_shift );
FT_PreLine pl = slot->prelines;
while (pl!=NULL)
{
pl->x1 += x_shift;
pl->y1 += y_shift;
pl->x2 += x_shift;
pl->y2 += y_shift;
pl = pl->next;
}
slot->prel_shifted = 1;
}
if ( mode == FT_RENDER_MODE_NORMAL ||
mode == FT_RENDER_MODE_LIGHT )
@ -517,6 +529,8 @@
params.target = bitmap;
params.source = outline;
params.flags = FT_RASTER_FLAG_AA;
params.prelines = slot->prelines;
error = render->raster_render( render->raster, &params );
}
@ -568,8 +582,9 @@
slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
}
if ( x_shift || y_shift )
FT_Outline_Translate( outline, -x_shift, -y_shift );
// if ( x_shift || y_shift ){
// FT_Outline_Translate( outline, -x_shift, -y_shift );
// }
return error;
}

Loading…
Cancel
Save