#include "imager.h"
+#include "imrender.h"
#include <sys/types.h>
#include <sys/stat.h>
mm_log((1,"Initializing fonts\n"));
#ifdef HAVE_LIBT1
- i_init_t1(t1log);
-#endif
-
-#ifdef HAVE_LIBTT
- i_init_tt();
-#endif
-
-#ifdef HAVE_FT2
- if (!i_ft2_init())
+ if (i_init_t1(t1log))
return 0;
#endif
-
+
return(1); /* FIXME: Always true - check the return values of the init_t1 and init_tt functions */
}
int init_flags = IGNORE_CONFIGFILE|IGNORE_FONTDATABASE;
mm_log((1,"init_t1()\n"));
+ i_clear_error();
+
if (t1_active_fonts) {
mm_log((1, "Cannot re-initialize T1 - active fonts\n"));
+ i_push_error(0, "Cannot re-initialize T1 - active fonts");
return 1;
}
init_flags |= LOGFILE;
if ((T1_InitLib(init_flags) == NULL)){
mm_log((1,"Initialization of t1lib failed\n"));
+ i_push_error(0, "T1_InitLib failed");
return(1);
}
T1_SetLogLevel(T1LOG_DEBUG);
i_t1_new(char *pfb,char *afm) {
int font_id;
+ i_clear_error();
+
+ if (!t1_initialized && i_init_t1(0))
+ return -1;
+
mm_log((1,"i_t1_new(pfb %s,afm %s)\n",pfb,(afm?afm:"NULL")));
font_id = T1_AddFont(pfb);
if (font_id<0) {
undef_int
i_t1_text(i_img *im,int xb,int yb,const i_color *cl,int fontnum,float points,const char* str,int len,int align, int utf8, char const *flags) {
GLYPH *glyph;
- int xsize,ysize,x,y,ch;
- i_color val;
- unsigned char c,i;
+ int xsize,ysize,y;
int mod_flags = t1_get_flags(flags);
+ i_render r;
if (im == NULL) { mm_log((1,"i_t1_cp: Null image in input\n")); return(0); }
mm_log((1,"width: %d height: %d\n",xsize,ysize));
if (align==1) { xb+=glyph->metrics.leftSideBearing; yb-=glyph->metrics.ascent; }
-
- for(y=0;y<ysize;y++) for(x=0;x<xsize;x++) {
- c=glyph->bits[y*xsize+x];
- i=255-c;
- i_gpix(im,x+xb,y+yb,&val);
- for(ch=0;ch<im->channels;ch++) val.channel[ch]=(c*cl->channel[ch]+i*val.channel[ch])/255;
- i_ppix(im,x+xb,y+yb,&val);
+
+ i_render_init(&r, im, xsize);
+ for(y=0;y<ysize;y++) {
+ i_render_color(&r, xb, yb+y, xsize, (unsigned char *)glyph->bits+y*xsize, cl);
}
+ i_render_done(&r);
+
return 1;
}
/* static globals needed */
+static int TT_initialized = 0;
static TT_Engine engine;
static int LTT_dpi = 72; /* FIXME: this ought to be a part of the call interface */
static int LTT_hinted = 1; /* FIXME: this too */
*/
undef_int
-i_init_tt() {
+i_init_tt(void) {
TT_Error error;
TT_Byte palette[] = { 0, 64, 127, 191, 255 };
+ i_clear_error();
+
mm_log((1,"init_tt()\n"));
error = TT_Init_FreeType( &engine );
if ( error ){
mm_log((1,"Initialization of freetype failed, code = 0x%x\n",error));
+ i_tt_push_error(error);
+ i_push_error(0, "Could not initialize freetype 1.x");
return(1);
}
error = TT_Init_Post_Extension( engine );
if (error) {
mm_log((1, "Initialization of Post extension failed = 0x%x\n", error));
+
+ i_tt_push_error(error);
+ i_push_error(0, "Could not initialize FT 1.x POST extension");
return 1;
}
#endif
error = TT_Set_Raster_Gray_Palette(engine, palette);
if (error) {
mm_log((1, "Initialization of gray levels failed = 0x%x\n", error));
+ i_tt_push_error(error);
+ i_push_error(0, "Could not initialize FT 1.x POST extension");
return 1;
}
+ TT_initialized = 1;
+
return(0);
}
unsigned short i,n;
unsigned short platform,encoding;
+ if (!TT_initialized && i_init_tt()) {
+ i_push_error(0, "Could not initialize FT1 engine");
+ return NULL;
+ }
+
i_clear_error();
mm_log((1,"i_tt_new(fontname '%s')\n",fontname));
void
i_tt_dump_raster_map2( i_img* im, TT_Raster_Map* bit, int xb, int yb, const i_color *cl, int smooth ) {
unsigned char *bmap;
- i_color val;
- int c, i, ch, x, y;
+ int x, y;
mm_log((1,"i_tt_dump_raster_map2(im 0x%x, bit 0x%X, xb %d, yb %d, cl 0x%X)\n",im,bit,xb,yb,cl));
bmap = bit->bitmap;
if ( smooth ) {
+ i_render r;
+ i_render_init(&r, im, bit->cols);
for(y=0;y<bit->rows;y++) {
+#if 0
for(x=0;x<bit->width;x++) {
- c = (unsigned char)bmap[y*(bit->cols)+x];
- i=255-c;
- i_gpix(im,x+xb,y+yb,&val);
- for(ch=0;ch<im->channels;ch++)
- val.channel[ch] = (c*cl->channel[ch]+i*val.channel[ch])/255;
- i_ppix(im,x+xb,y+yb,&val);
+ c = (unsigned char)bmap[y*(bit->cols)+x];
+ i=255-c;
+ i_gpix(im,x+xb,y+yb,&val);
+ for(ch=0;ch<im->channels;ch++)
+ val.channel[ch] = (c*cl->channel[ch]+i*val.channel[ch])/255;
+ i_ppix(im,x+xb,y+yb,&val);
}
+#else
+ i_render_color(&r, xb, yb+y, bit->cols, bmap + y*bit->cols, cl);
+#endif
}
-
+ i_render_done(&r);
} else {
for(y=0;y<bit->rows;y++) {
unsigned mask = 0x80;
static
void
i_tt_dump_raster_map_channel( i_img* im, TT_Raster_Map* bit, int xb, int yb, int channel, int smooth ) {
- char *bmap;
+ unsigned char *bmap;
i_color val;
int c,x,y;
+ int old_mask = im->ch_mask;
+ im->ch_mask = 1 << channel;
mm_log((1,"i_tt_dump_raster_channel(im 0x%x, bit 0x%X, xb %d, yb %d, channel %d)\n",im,bit,xb,yb,channel));
- bmap = (char *)bit->bitmap;
+ bmap = bit->bitmap;
if ( smooth ) {
for(y=0;y<bit->rows;y++) for(x=0;x<bit->width;x++) {
- c = (unsigned char)bmap[y*(bit->cols)+x];
- i_gpix(im,x+xb,y+yb,&val);
- val.channel[channel]=c;
+ c = bmap[y*(bit->cols)+x];
+ val.channel[channel] = c;
i_ppix(im,x+xb,y+yb,&val);
}
} else {
unsigned char *p = bmap + y * bit->cols;
for(x=0;x<bit->width;x++) {
- i_gpix(im,x+xb,y+yb,&val);
val.channel[channel] = (*p & mask) ? 255 : 0;
i_ppix(im,x+xb,y+yb,&val);
}
}
}
+ im->ch_mask = old_mask;
}