In order to get right the cursor position on text on mouse clicks it is needed to take into account text's subpixel positioning. This fix mostly corrects the problem but cursor positioning is still somewhat inaccurate for long lines due to repeated commands to draw a text along a line. Repeated draw text calls make the subpixel information lost and small errors will add-up.
59 lines
1.5 KiB
C++
59 lines
1.5 KiB
C++
#ifndef FONT_RENDERER_H
|
|
#define FONT_RENDERER_H
|
|
|
|
#include <stdint.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef struct {
|
|
unsigned short x0, y0, x1, y1;
|
|
float xoff, yoff, xadvance;
|
|
} FR_Bitmap_Glyph_Metrics;
|
|
|
|
typedef struct FR_Bitmap FR_Bitmap;
|
|
|
|
#ifdef __cplusplus
|
|
class FR_Renderer;
|
|
#else
|
|
struct FR_Renderer;
|
|
typedef struct FR_Renderer FR_Renderer;
|
|
#endif
|
|
|
|
enum {
|
|
FR_HINTING = 1 << 0,
|
|
FR_KERNING = 1 << 1,
|
|
FR_SUBPIXEL = 1 << 2,
|
|
FR_PRESCALE_X = 1 << 3,
|
|
};
|
|
|
|
typedef struct {
|
|
uint8_t r, g, b;
|
|
} FR_Color;
|
|
|
|
typedef struct {
|
|
int left, top, right, bottom;
|
|
} FR_Clip_Area;
|
|
|
|
FR_Renderer * FR_Renderer_New(unsigned int flags);
|
|
void FR_Renderer_Free(FR_Renderer *);
|
|
int FR_Load_Font(FR_Renderer *, const char *filename);
|
|
FR_Bitmap* FR_Bitmap_New(FR_Renderer *, int width, int height);
|
|
void FR_Bitmap_Free(FR_Bitmap *image);
|
|
int FR_Get_Font_Height(FR_Renderer *, float size);
|
|
FR_Bitmap * FR_Bake_Font_Bitmap(FR_Renderer *, int font_height,
|
|
int first_char, int num_chars, FR_Bitmap_Glyph_Metrics *glyph_info);
|
|
void FR_Blend_Glyph(FR_Renderer *font_renderer,
|
|
FR_Clip_Area *clip, int x, int y,
|
|
uint8_t *dst, int dst_width,
|
|
const FR_Bitmap *glyphs_bitmap,
|
|
const FR_Bitmap_Glyph_Metrics *glyph, FR_Color color);
|
|
int FR_Subpixel_Scale(FR_Renderer *);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|