static void ft2_push_message(int code);
+static int ft2_initialized = 0;
static FT_Library library;
/*
i_push_error(0, "Initializing Freetype2");
return 0;
}
+
+ ft2_initialized = 1;
+
return 1;
}
mm_log((1, "i_ft2_new(name %p, index %d)\n", name, index));
+ if (!ft2_initialized && !i_ft2_init())
+ return NULL;
+
i_clear_error();
error = FT_New_Face(library, name, index, &face);
if (error) {
FT_Glyph_Metrics *gm;
int start = 0;
int loadFlags = FT_LOAD_DEFAULT;
- int rightb;
+ int rightb = 0;
mm_log((1, "i_ft2_bbox(handle %p, cheight %f, cwidth %f, text %p, len %d, bbox %p)\n",
handle, cheight, cwidth, text, len, bbox));
unsigned char map[256];
char last_mode = ft_pixel_mode_none;
int last_grays = -1;
- int ch;
- i_color pel;
int loadFlags = FT_LOAD_DEFAULT;
+ i_render render;
mm_log((1, "i_ft2_text(handle %p, im %p, tx %d, ty %d, cl %p, cheight %f, cwidth %f, text %p, len %d, align %d, aa %d)\n",
handle, im, tx, ty, cl, cheight, cwidth, text, align, aa));
if (!i_ft2_bbox(handle, cheight, cwidth, text, len, bbox, utf8))
return 0;
+ if (aa)
+ i_render_init(&render, im, bbox[BBOX_POS_WIDTH] - bbox[BBOX_NEG_WIDTH]);
+
if (!align) {
/* this may need adjustment */
tx -= bbox[0] * handle->matrix[0] + bbox[5] * handle->matrix[1] + handle->matrix[2];
ft2_push_message(error);
i_push_errorf(0, "loading glyph for character \\x%02x (glyph 0x%04X)",
c, index);
+ if (aa)
+ i_render_done(&render);
return 0;
}
slot = handle->face->glyph;
if (error) {
ft2_push_message(error);
i_push_errorf(0, "rendering glyph 0x%04X (character \\x%02X)");
+ if (aa)
+ i_render_done(&render);
return 0;
}
if (slot->bitmap.pixel_mode == ft_pixel_mode_mono) {
last_mode = slot->bitmap.pixel_mode;
last_grays = slot->bitmap.num_grays;
}
-
+
bmp = slot->bitmap.buffer;
for (y = 0; y < slot->bitmap.rows; ++y) {
- for (x = 0; x < slot->bitmap.width; ++x) {
- int value = map[bmp[x]];
- if (value) {
- i_gpix(im, tx+x+slot->bitmap_left, ty+y-slot->bitmap_top, &pel);
- for (ch = 0; ch < im->channels; ++ch) {
- pel.channel[ch] =
- ((255-value)*pel.channel[ch] + value * cl->channel[ch]) / 255;
- }
- i_ppix(im, tx+x+slot->bitmap_left, ty+y-slot->bitmap_top, &pel);
- }
- }
+ if (last_mode == ft_pixel_mode_grays &&
+ last_grays != 255) {
+ for (x = 0; x < slot->bitmap.width; ++x)
+ bmp[x] = map[bmp[x]];
+ }
+ i_render_color(&render, tx + slot->bitmap_left, ty-slot->bitmap_top+y,
+ slot->bitmap.width, bmp, cl);
bmp += slot->bitmap.pitch;
}
}
ty -= slot->advance.y / 64;
}
+ if (aa)
+ i_render_done(&render);
+
return 1;
}