BLF: use 'int' for internal glyph x,y bearing

These were stored as float but were originally cast from an int
and were often cast back to int.

Also use int pairs for dimensions values.
This commit is contained in:
Campbell Barton 2020-05-03 17:55:39 +10:00
parent 5366eb89c6
commit ccaab72685
9 changed files with 61 additions and 84 deletions

View File

@ -121,7 +121,7 @@ typedef bool (*BLF_GlyphBoundsFn)(const char *str,
const struct rcti *glyph_step_bounds,
const int glyph_advance_x,
const struct rctf *glyph_bounds,
const float glyph_bearing[2],
const int glyph_bearing[2],
void *user_data);
void BLF_boundbox_foreach_glyph_ex(int fontid,

View File

@ -946,8 +946,8 @@ void BLF_buffer(int fontid,
if (font) {
font->buf_info.fbuf = fbuf;
font->buf_info.cbuf = cbuf;
font->buf_info.w = w;
font->buf_info.h = h;
font->buf_info.dims[0] = w;
font->buf_info.dims[1] = h;
font->buf_info.ch = nch;
font->buf_info.display = display;
}

View File

@ -613,28 +613,28 @@ static void blf_font_draw_buffer_ex(FontBLF *font,
BLF_KERNING_STEP_FAST(font, kern_mode, g_prev, g, c_prev, c, pen_x);
}
chx = pen_x + ((int)g->pos_x);
chy = pen_y_basis + g->height;
chx = pen_x + ((int)g->pos[0]);
chy = pen_y_basis + g->dims[1];
if (g->pitch < 0) {
pen_y = pen_y_basis + (g->height - (int)g->pos_y);
pen_y = pen_y_basis + (g->dims[1] - g->pos[1]);
}
else {
pen_y = pen_y_basis - (g->height - (int)g->pos_y);
pen_y = pen_y_basis - (g->dims[1] - g->pos[1]);
}
if ((chx + g->width) >= 0 && chx < buf_info->w && (pen_y + g->height) >= 0 &&
pen_y < buf_info->h) {
if ((chx + g->dims[0]) >= 0 && chx < buf_info->dims[0] && (pen_y + g->dims[1]) >= 0 &&
pen_y < buf_info->dims[1]) {
/* don't draw beyond the buffer bounds */
int width_clip = g->width;
int height_clip = g->height;
int yb_start = g->pitch < 0 ? 0 : g->height - 1;
int width_clip = g->dims[0];
int height_clip = g->dims[1];
int yb_start = g->pitch < 0 ? 0 : g->dims[1] - 1;
if (width_clip + chx > buf_info->w) {
width_clip -= chx + width_clip - buf_info->w;
if (width_clip + chx > buf_info->dims[0]) {
width_clip -= chx + width_clip - buf_info->dims[0];
}
if (height_clip + pen_y > buf_info->h) {
height_clip -= pen_y + height_clip - buf_info->h;
if (height_clip + pen_y > buf_info->dims[1]) {
height_clip -= pen_y + height_clip - buf_info->dims[1];
}
/* drawing below the image? */
@ -652,7 +652,7 @@ static void blf_font_draw_buffer_ex(FontBLF *font,
if (a_byte) {
const float a = (a_byte / 255.0f) * b_col_float[3];
const size_t buf_ofs = (((size_t)(chx + x) +
((size_t)(pen_y + y) * (size_t)buf_info->w)) *
((size_t)(pen_y + y) * (size_t)buf_info->dims[0])) *
(size_t)buf_info->ch);
float *fbuf = buf_info->fbuf + buf_ofs;
@ -689,7 +689,7 @@ static void blf_font_draw_buffer_ex(FontBLF *font,
if (a_byte) {
const float a = (a_byte / 255.0f) * b_col_float[3];
const size_t buf_ofs = (((size_t)(chx + x) +
((size_t)(pen_y + y) * (size_t)buf_info->w)) *
((size_t)(pen_y + y) * (size_t)buf_info->dims[0])) *
(size_t)buf_info->ch);
unsigned char *cbuf = buf_info->cbuf + buf_ofs;
@ -1246,13 +1246,13 @@ static void blf_font_boundbox_foreach_glyph_ex(FontBLF *font,
}
gbox.xmin = pen_x;
gbox.xmax = gbox.xmin + MIN2(g->advance_i, g->width);
gbox.xmax = gbox.xmin + MIN2(g->advance_i, g->dims[0]);
gbox.ymin = pen_y;
gbox.ymax = gbox.ymin - g->height;
gbox.ymax = gbox.ymin - g->dims[1];
pen_x += g->advance_i;
if (user_fn(str, i_curr, &gbox, g->advance_i, &g->box, &g->pos_x, user_data) == false) {
if (user_fn(str, i_curr, &gbox, g->advance_i, &g->box, g->pos, user_data) == false) {
break;
}
@ -1365,8 +1365,8 @@ static void blf_font_fill(FontBLF *font)
font->buf_info.fbuf = NULL;
font->buf_info.cbuf = NULL;
font->buf_info.w = 0;
font->buf_info.h = 0;
font->buf_info.dims[0] = 0;
font->buf_info.dims[1] = 0;
font->buf_info.ch = 0;
font->buf_info.col_init[0] = 0;
font->buf_info.col_init[1] = 0;

View File

@ -327,26 +327,26 @@ GlyphBLF *blf_glyph_add(FontBLF *font, GlyphCacheBLF *gc, unsigned int index, un
g->c = c;
g->idx = (FT_UInt)index;
bitmap = slot->bitmap;
g->width = (int)bitmap.width;
g->height = (int)bitmap.rows;
g->dims[0] = (int)bitmap.width;
g->dims[1] = (int)bitmap.rows;
if (g->width && g->height) {
if (g->dims[0] && g->dims[1]) {
if (font->flags & BLF_MONOCHROME) {
/* Font buffer uses only 0 or 1 values, Blender expects full 0..255 range */
int i;
for (i = 0; i < (g->width * g->height); i++) {
for (i = 0; i < (g->dims[0] * g->dims[1]); i++) {
bitmap.buffer[i] = bitmap.buffer[i] ? 255 : 0;
}
}
g->bitmap = (unsigned char *)MEM_mallocN((size_t)g->width * (size_t)g->height, "glyph bitmap");
memcpy((void *)g->bitmap, (void *)bitmap.buffer, (size_t)g->width * (size_t)g->height);
g->bitmap = MEM_mallocN((size_t)g->dims[0] * (size_t)g->dims[1], "glyph bitmap");
memcpy(g->bitmap, (void *)bitmap.buffer, (size_t)g->dims[0] * (size_t)g->dims[1]);
}
g->advance = ((float)slot->advance.x) / 64.0f;
g->advance_i = (int)g->advance;
g->pos_x = (float)slot->bitmap_left;
g->pos_y = (float)slot->bitmap_top;
g->pos[0] = slot->bitmap_left;
g->pos[1] = slot->bitmap_top;
g->pitch = slot->bitmap.pitch;
FT_Outline_Get_CBox(&(slot->outline), &bbox);
@ -431,10 +431,10 @@ static void blf_texture3_draw(const unsigned char color_in[4],
static void blf_glyph_calc_rect(rctf *rect, GlyphBLF *g, float x, float y)
{
rect->xmin = floorf(x + g->pos_x);
rect->xmax = rect->xmin + (float)g->width;
rect->ymin = floorf(y + g->pos_y);
rect->ymax = rect->ymin - (float)g->height;
rect->xmin = floorf(x + (float)g->pos[0]);
rect->xmax = rect->xmin + (float)g->dims[0];
rect->ymin = floorf(y + (float)g->pos[1]);
rect->ymax = rect->ymin - (float)g->dims[1];
}
static void blf_glyph_calc_rect_test(rctf *rect, GlyphBLF *g, float x, float y)
@ -443,9 +443,9 @@ static void blf_glyph_calc_rect_test(rctf *rect, GlyphBLF *g, float x, float y)
* width used by BLF_width. This allows that the text slightly
* overlaps the clipping border to achieve better alignment. */
rect->xmin = floorf(x);
rect->xmax = rect->xmin + MIN2(g->advance, (float)g->width);
rect->xmax = rect->xmin + MIN2(g->advance, (float)g->dims[0]);
rect->ymin = floorf(y);
rect->ymax = rect->ymin - (float)g->height;
rect->ymax = rect->ymin - (float)g->dims[1];
}
static void blf_glyph_calc_rect_shadow(rctf *rect, GlyphBLF *g, float x, float y, FontBLF *font)
@ -455,7 +455,7 @@ static void blf_glyph_calc_rect_shadow(rctf *rect, GlyphBLF *g, float x, float y
void blf_glyph_render(FontBLF *font, GlyphCacheBLF *gc, GlyphBLF *g, float x, float y)
{
if ((!g->width) || (!g->height)) {
if ((!g->dims[0]) || (!g->dims[1])) {
return;
}
@ -466,7 +466,7 @@ void blf_glyph_render(FontBLF *font, GlyphCacheBLF *gc, GlyphBLF *g, float x, fl
g->offset = gc->bitmap_len;
int buff_size = g->width * g->height;
int buff_size = g->dims[0] * g->dims[1];
int bitmap_len = gc->bitmap_len + buff_size;
if (bitmap_len > gc->bitmap_len_alloc) {
@ -514,7 +514,7 @@ void blf_glyph_render(FontBLF *font, GlyphCacheBLF *gc, GlyphBLF *g, float x, fl
if (font->shadow == 0) {
blf_texture_draw(font->shadow_color,
(int[2]){g->width, g->height},
g->dims,
g->offset,
rect_ofs.xmin,
rect_ofs.ymin,
@ -523,7 +523,7 @@ void blf_glyph_render(FontBLF *font, GlyphCacheBLF *gc, GlyphBLF *g, float x, fl
}
else if (font->shadow <= 4) {
blf_texture3_draw(font->shadow_color,
(int[2]){g->width, g->height},
g->dims,
g->offset,
rect_ofs.xmin,
rect_ofs.ymin,
@ -532,7 +532,7 @@ void blf_glyph_render(FontBLF *font, GlyphCacheBLF *gc, GlyphBLF *g, float x, fl
}
else {
blf_texture5_draw(font->shadow_color,
(int[2]){g->width, g->height},
g->dims,
g->offset,
rect_ofs.xmin,
rect_ofs.ymin,
@ -547,39 +547,18 @@ void blf_glyph_render(FontBLF *font, GlyphCacheBLF *gc, GlyphBLF *g, float x, fl
#if BLF_BLUR_ENABLE
switch (font->blur) {
case 3:
blf_texture3_draw(font->color,
(int[2]){g->width, g->height},
g->offset,
rect.xmin,
rect.ymin,
rect.xmax,
rect.ymax);
blf_texture3_draw(
font->color, g->dims, g->offset, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
break;
case 5:
blf_texture5_draw(font->color,
(int[2]){g->width, g->height},
g->offset,
rect.xmin,
rect.ymin,
rect.xmax,
rect.ymax);
blf_texture5_draw(
font->color, g->dims, g->offset, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
break;
default:
blf_texture_draw(font->color,
(int[2]){g->width, g->height},
g->offset,
rect.xmin,
rect.ymin,
rect.xmax,
rect.ymax);
blf_texture_draw(
font->color, g->dims, g->offset, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
}
#else
blf_texture_draw(font->color,
(int[2]){g->width, g->height},
g->offset,
rect.xmin,
rect.ymin,
rect.xmax,
rect.ymax);
blf_texture_draw(font->color, g->dims, g->offset, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
#endif
}

View File

@ -107,7 +107,7 @@ void blf_font_boundbox_foreach_glyph(struct FontBLF *font,
const struct rcti *glyph_step_bounds,
const int glyph_advance_x,
const struct rctf *glyph_bounds,
const float glyph_bearing[2],
const int glyph_bearing[2],
void *user_data),
void *user_data,
struct ResultBLF *r_info);

View File

@ -119,17 +119,16 @@ typedef struct GlyphBLF {
*/
unsigned char *bitmap;
/* glyph width and height. */
int width;
int height;
/* Glyph width and height. */
int dims[2];
int pitch;
/* X and Y bearing of the glyph.
/**
* X and Y bearing of the glyph.
* The X bearing is from the origin to the glyph left bbox edge.
* The Y bearing is from the baseline to the top of the glyph edge.
*/
float pos_x;
float pos_y;
int pos[2];
struct GlyphCacheBLF *glyph_cache;
} GlyphBLF;
@ -141,9 +140,8 @@ typedef struct FontBufInfoBLF {
/* the same but unsigned char */
unsigned char *cbuf;
/* buffer size, keep signed so comparisons with negative values work */
int w;
int h;
/** Buffer size, keep signed so comparisons with negative values work. */
int dims[2];
/* number of channels. */
int ch;

View File

@ -78,8 +78,8 @@ void BLF_thumb_preview(const char *filename,
/* Would be done via the BLF API, but we're not using a fontid here */
font->buf_info.cbuf = buf;
font->buf_info.ch = channels;
font->buf_info.w = w;
font->buf_info.h = h;
font->buf_info.dims[0] = w;
font->buf_info.dims[1] = h;
/* Always create the image with a white font,
* the caller can theme how it likes */

View File

@ -2853,7 +2853,7 @@ static bool ui_textedit_set_cursor_pos_foreach_glyph(const char *UNUSED(str),
const rcti *glyph_step_bounds,
const int UNUSED(glyph_advance_x),
const rctf *glyph_bounds,
const float UNUSED(glyph_bearing[2]),
const int UNUSED(glyph_bearing[2]),
void *user_data)
{
int *cursor_data = user_data;

View File

@ -2099,7 +2099,7 @@ static bool widget_draw_text_underline_calc_center_x(const char *UNUSED(str),
const rcti *glyph_step_bounds,
const int UNUSED(glyph_advance_x),
const rctf *glyph_bounds,
const float glyph_bearing[2],
const int glyph_bearing[2],
void *user_data)
{
/* The index of the character to get, set to the x-position. */