#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));
i_tt_blit_or( TT_Raster_Map *dst, TT_Raster_Map *src,int x_off, int y_off ) {
int x, y;
int x1, x2, y1, y2;
- char *s, *d;
+ unsigned char *s, *d;
x1 = x_off < 0 ? -x_off : 0;
y1 = y_off < 0 ? -y_off : 0;
/* do the real work now */
for ( y = y1; y < y2; ++y ) {
- s = ( (char*)src->bitmap ) + y * src->cols + x1;
- d = ( (char*)dst->bitmap ) + ( y + y_off ) * dst->cols + x1 + x_off;
+ s = ( (unsigned char*)src->bitmap ) + y * src->cols + x1;
+ d = ( (unsigned char*)dst->bitmap ) + ( y + y_off ) * dst->cols + x1 + x_off;
for ( x = x1; x < x2; ++x ) {
if (*s > *d)
static
void
i_tt_dump_raster_map2( i_img* im, TT_Raster_Map* bit, int xb, int yb, const i_color *cl, int smooth ) {
- char *bmap;
- i_color val;
- int c, i, ch, x, y;
+ unsigned char *bmap;
+ 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 = (char *)bit->bitmap;
+ bmap = bit->bitmap;
if ( smooth ) {
- for(y=0;y<bit->rows;y++) for(x=0;x<bit->width;x++) {
- c=(255*bmap[y*(bit->cols)+x])/4;
- 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 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);
+ }
+#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++) for(x=0;x<bit->width;x++) {
- c=( bmap[y*bit->cols+x/8] & (128>>(x%8)) ) ? 255 : 0;
- 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);
+ for(y=0;y<bit->rows;y++) {
+ unsigned mask = 0x80;
+ unsigned char *p = bmap + y * bit->cols;
+
+ for(x = 0; x < bit->width; x++) {
+ if (*p & mask) {
+ i_ppix(im, x+xb, y+yb, cl);
+ }
+ mask >>= 1;
+ if (!mask) {
+ mask = 0x80;
+ ++p;
+ }
+ }
}
}
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=(255*bmap[y*(bit->cols)+x])/4;
- 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 {
- for(y=0;y<bit->rows;y++) for(x=0;x<bit->width;x++) {
- c=( bmap[y*bit->cols+x/8] & (128>>(x%8)) ) ? 255 : 0;
- i_gpix(im,x+xb,y+yb,&val);
- val.channel[channel]=c;
- i_ppix(im,x+xb,y+yb,&val);
+ for(y=0;y<bit->rows;y++) {
+ unsigned mask = 0x80;
+ unsigned char *p = bmap + y * bit->cols;
+
+ for(x=0;x<bit->width;x++) {
+ val.channel[channel] = (*p & mask) ? 255 : 0;
+ i_ppix(im,x+xb,y+yb,&val);
+
+ mask >>= 1;
+ if (!mask) {
+ ++p;
+ mask = 0x80;
+ }
+ }
}
}
+ im->ch_mask = old_mask;
}
printf("'%s'\n", name);
}
}
+ fflush(stdout);
}
int
}
if (handle->load_cond) {
- i_push_errorf(rc, "error loading names (%d)", handle->load_cond);
+ i_push_errorf(handle->load_cond, "error loading names (%d)", handle->load_cond);
return 0;
}