Trying to get it to work attempt #1

This commit is contained in:
Anurag Thakur 2021-10-30 00:57:51 +05:30
parent e66db7ec5c
commit 43a66f774c
3 changed files with 51 additions and 35 deletions

View File

@ -9,6 +9,7 @@
#include <freetype/internal/ftdebug.h>
#include <freetype/internal/ftobjs.h>
#include <math.h>
#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 );
}

View File

@ -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,

View File

@ -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;