mkfont: Add "no drop shadow" gradients.

This commit is contained in:
Marisa the Magician 2023-01-10 13:35:15 +01:00
commit 453b64c179

View file

@ -329,7 +329,7 @@ palend:
fclose(f); fclose(f);
} }
const char grads[8][20] = const char grads[12][20] =
{ {
"Flat (Shadow)", "Flat (Shadow)",
"Top-Bottom (Shadow)", "Top-Bottom (Shadow)",
@ -338,7 +338,11 @@ const char grads[8][20] =
"Flat (Border)", "Flat (Border)",
"Top-Bottom (Border)", "Top-Bottom (Border)",
"Bottom-Top (Border)", "Bottom-Top (Border)",
"Centered (Border)" "Centered (Border)",
"Flat",
"Top-Bottom",
"Bottom-Top",
"Centered"
}; };
#define LOADFLAGS FT_LOAD_PEDANTIC #define LOADFLAGS FT_LOAD_PEDANTIC
@ -349,7 +353,7 @@ int main( int argc, char **argv )
if ( argc < 3 ) if ( argc < 3 )
{ {
fprintf(stderr,"usage: mkfont <font name> <pxsize> <unicode range (hex)>" fprintf(stderr,"usage: mkfont <font name> <pxsize> <unicode range (hex)>"
" [gradient type] [color palette] [-palinv]\n"); " [gradient type (0,11)] [color palette] [-palinv]\n");
return 1; return 1;
} }
if ( FT_Init_FreeType(&ftlib) ) if ( FT_Init_FreeType(&ftlib) )
@ -361,7 +365,15 @@ int main( int argc, char **argv )
int pxsiz; int pxsiz;
sscanf(argv[2],"%d",&pxsiz); sscanf(argv[2],"%d",&pxsiz);
sscanf(argv[3],"%x-%x",&range[0],&range[1]); sscanf(argv[3],"%x-%x",&range[0],&range[1]);
if ( argc > 4 ) sscanf(argv[4],"%d",&gradient); if ( argc > 4 )
{
sscanf(argv[4],"%d",&gradient);
if ( (gradient < 0) || (gradient >= 12) )
{
fprintf(stderr,"warning: gradient type out of range, falling back to type 0.\n");
gradient = 0;
}
}
if ( argc > 6 ) palinv = !strcmp(argv[6],"-palinv"); if ( argc > 6 ) palinv = !strcmp(argv[6],"-palinv");
if ( argc > 5 ) loadpalette(argv[5]); if ( argc > 5 ) loadpalette(argv[5]);
if ( FT_New_Face(ftlib,argv[1],0,&fnt) ) if ( FT_New_Face(ftlib,argv[1],0,&fnt) )
@ -433,16 +445,24 @@ int main( int argc, char **argv )
} }
fprintf(stderr,"info: max cell size is %dx%d.\n",w,h); fprintf(stderr,"info: max cell size is %dx%d.\n",w,h);
} }
iw = w+1; if ( gradient&8 )
ih = h+1;
if ( gradient&4 )
{ {
bordshift = 1; iw = w;
iw++; ih = h;
ih++; }
else
{
iw = w+1;
ih = h+1;
if ( gradient&4 )
{
bordshift = 1;
iw++;
ih++;
}
} }
datsiz = palsize?(iw*ih*4):(iw*ih*2); datsiz = palsize?(iw*ih*4):(iw*ih*2);
fprintf(stderr,"info: gradient selected is '%s'.\n",grads[gradient&7]); fprintf(stderr,"info: gradient selected is '%s'.\n",grads[gradient]);
idata = calloc(datsiz,1); idata = calloc(datsiz,1);
uint32_t drawn = 0; uint32_t drawn = 0;
for ( uint32_t i=range[0]; i<=range[1]; i++ ) for ( uint32_t i=range[0]; i<=range[1]; i++ )
@ -471,7 +491,9 @@ int main( int argc, char **argv )
fnt->glyph->bitmap_top++; fnt->glyph->bitmap_top++;
valid = 0; valid = 0;
oob = 0; oob = 0;
if ( gradient&4 ) if ( gradient&8 ) // no shadow nor gradient
valid = draw_glyph(&fnt->glyph->bitmap,255,xx,yy,fnt->glyph->bitmap_left,h-fnt->glyph->bitmap_top);
else if ( gradient&4 )
{ {
// draw outline first // draw outline first
draw_glyph(&fnt->glyph->bitmap,0,xx,yy,fnt->glyph->bitmap_left,h-fnt->glyph->bitmap_top); draw_glyph(&fnt->glyph->bitmap,0,xx,yy,fnt->glyph->bitmap_left,h-fnt->glyph->bitmap_top);