diff --git a/src/dense/ftdense.c b/src/dense/ftdense.c index 5ff511a77..e7f1b473f 100644 --- a/src/dense/ftdense.c +++ b/src/dense/ftdense.c @@ -9,6 +9,7 @@ #include #include +#include #include "ftdenseerrs.h" typedef struct dense_TRaster_ @@ -30,7 +31,6 @@ static int dense_move_to( const FT_Vector* to, RasterFP* aRasterFP ) { RasterFP_Point lp = { to->x, to->y }; - aRasterFP->last_point = lp; return 0; } @@ -49,6 +49,8 @@ dense_line_to( const FT_Vector* to, RasterFP* aRasterFP ) void RasterFP_DrawLine( RasterFP* aRasterFP, RasterFP_Point aP0, RasterFP_Point aP1 ) { + // printf( "\n%f\n", aRasterFP->m_w ); + // printf( "\n%f\n", aRasterFP->m_h ); // assert( aRasterFP ); if ( aP0.m_y == aP1.m_y ) return; @@ -139,6 +141,13 @@ RasterFP_DrawLine( RasterFP* aRasterFP, RasterFP_Point aP0, RasterFP_Point aP1 ) int y0 = (int)aP0.m_y; int y_limit = (int)ceil( aP1.m_y ); float* m_a = aRasterFP->m_a; + + // printf( "%f\n", x ); + // printf( "%d\n", y0 ); + // printf( "%d\n", y_limit ); + // printf( "%p\n", m_a ); + + for ( int y = y0; y < y_limit; y++ ) { int linestart = y * aRasterFP->m_w; @@ -197,6 +206,7 @@ RasterFP_DrawLine( RasterFP* aRasterFP, RasterFP_Point aP0, RasterFP_Point aP1 ) } x = xnext; } + } @@ -341,7 +351,6 @@ dense_raster_new( FT_Memory memory, dense_PRaster* araster ) raster->memory = memory; *araster = raster; - return error; } @@ -385,9 +394,9 @@ FT_DEFINE_OUTLINE_FUNCS( dense_decompose_funcs, ) static int -dense_render_glyph( RasterFP* aRasterFP, FT_Bitmap* target ) +dense_render_glyph( RasterFP* aRasterFP, const FT_Bitmap* target ) { - FT_Error error = FT_Outline_Decompose( aRasterFP->outline, + FT_Error error = FT_Outline_Decompose( &(aRasterFP->outline), &dense_decompose_funcs, aRasterFP ); // Render into bitmap @@ -418,6 +427,8 @@ dense_raster_render( FT_Raster raster, const FT_Raster_Params* params ) const FT_Outline* outline = (const FT_Outline*)params->source; const FT_Bitmap* target_map = params->target; + printf( "Rasterizing glyph" ); + RasterFP* aRasterFP = malloc( sizeof( RasterFP ) ); if ( !raster ) @@ -426,7 +437,7 @@ dense_raster_render( FT_Raster raster, const FT_Raster_Params* params ) if ( !outline ) return FT_THROW( Invalid_Outline ); - aRasterFP->outline = outline; + aRasterFP->outline = *outline; if ( !target_map ) return FT_THROW( Invalid_Argument ); @@ -438,16 +449,27 @@ dense_raster_render( FT_Raster raster, const FT_Raster_Params* params ) if ( !target_map->buffer ) return FT_THROW( Invalid_Argument ); + aRasterFP->m_origin_x = 0; aRasterFP->m_origin_y = 0; - aRasterFP->m_w = (float)target_map->width; - aRasterFP->m_h = (float)target_map->rows; + aRasterFP->m_w = target_map->pitch; + aRasterFP->m_h = target_map->rows; + + int size = aRasterFP->m_w * aRasterFP->m_h + 4; + + aRasterFP->m_a = realloc(aRasterFP, sizeof(float) * size); + if ( aRasterFP->m_a == NULL ) + { + memset( aRasterFP, 0, sizeof( RasterFP ) ); + } + aRasterFP->m_a_size = size; + + memset( aRasterFP->m_a, 0, sizeof( float ) * size ); /* exit if nothing to do */ if ( aRasterFP->m_w <= aRasterFP->m_origin_x || aRasterFP->m_h <= aRasterFP->m_origin_y ) return 0; - return dense_render_glyph( aRasterFP, target_map ); } diff --git a/src/dense/ftdense.h b/src/dense/ftdense.h index e7c4c826c..f62f32db3 100644 --- a/src/dense/ftdense.h +++ b/src/dense/ftdense.h @@ -108,15 +108,10 @@ extern "C" RasterFP_Point last_point; - FT_Outline *outline; + FT_Outline outline; } RasterFP; void RasterFP_Create( RasterFP* aRasterFP ); - void RasterFP_StartRasterizing( RasterFP* aRasterFP, - int aOriginX, - int aOriginY, - int aWidth, - int aHeight ); void RasterFP_Destroy( RasterFP* aRasterFP ); void RasterFP_DrawLine( RasterFP* aRasterFP, RasterFP_Point aP0, diff --git a/src/dense/ftdenserend.c b/src/dense/ftdenserend.c index 983f52a71..b4996c25d 100644 --- a/src/dense/ftdenserend.c +++ b/src/dense/ftdenserend.c @@ -30,13 +30,11 @@ static FT_Error ft_dense_init( FT_Renderer render ) { - FT_Renderer dense_render = render; // dense_render->spread = 0; // dense_render->flip_sign = 0; // dense_render->flip_y = 0; // dense_render->overlaps = 0; - return FT_Err_Ok; } @@ -88,33 +86,34 @@ ft_dense_render( FT_Renderer render, if ( !bitmap->rows || !bitmap->pitch ) goto Exit; - /* ignore the pitch, pixel mode and set custom */ - bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; - bitmap->pitch = bitmap->width; - bitmap->num_grays = 255; - /* allocate new one */ - if ( FT_ALLOC_MULT( bitmap->buffer, bitmap->rows, bitmap->pitch ) ) - goto Exit; - /* the padding will simply be equal to the `spread' */ - x_shift = 64 * -slot->bitmap_left; - y_shift = 64 * -slot->bitmap_top; + // if ( FT_ALLOC_MULT( bitmap->buffer, bitmap->rows, bitmap->pitch ) ) + // goto Exit; + + // For whatever reason, it segfaults if the above is used for allocation + bitmap->buffer = realloc(bitmap->buffer, sizeof(int) * bitmap->rows * bitmap->pitch); + + + + /* the padding will simply be equal to the `spread' */ + // x_shift = 64 * -slot->bitmap_left; + // y_shift = 64 * -slot->bitmap_top; slot->internal->flags |= FT_GLYPH_OWN_BITMAP; - y_shift += 64 * (FT_Int)bitmap->rows; + // y_shift += 64 * (FT_Int)bitmap->rows; - if ( origin ) - { - x_shift += origin->x; - y_shift += origin->y; - } + // if ( origin ) + // { + // x_shift += origin->x; + // y_shift += origin->y; + // } - /* translate outline to render it into the bitmap */ - if ( x_shift || y_shift ) - FT_Outline_Translate( outline, x_shift, y_shift ); + // /* translate outline to render it into the bitmap */ + // if ( x_shift || y_shift ) + // FT_Outline_Translate( outline, x_shift, y_shift ); /* set up parameters */ params.target = bitmap;