diff options
Diffstat (limited to 'src/glibext/gbuffersegment.c')
-rw-r--r-- | src/glibext/gbuffersegment.c | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/src/glibext/gbuffersegment.c b/src/glibext/gbuffersegment.c index e610a51..ff32e3c 100644 --- a/src/glibext/gbuffersegment.c +++ b/src/glibext/gbuffersegment.c @@ -55,7 +55,7 @@ typedef struct _rendering_pattern_t #define CAIRO_FONT_WEIGHT_COUNT 2 #define CAIRO_FONTS_COUNT (CAIRO_FONT_SLANT_COUNT * CAIRO_FONT_WEIGHT_COUNT) -#define CAIRO_FONT_INDEX(s, w) ((s) * CAIRO_FONT_SLANT_COUNT + (w)) +#define CAIRO_FONT_INDEX(s, w) ((s) + (w) * CAIRO_FONT_WEIGHT_COUNT) /* Fragment de caractères aux propriétés communes (instance) */ struct _GBufferSegment @@ -73,7 +73,7 @@ struct _GBufferSegment GdkColor alt_fg; /* Couleur d'impression bis */ GdkColor *used_fg; /* Couleur d'impression utile */ - cairo_text_extents_t extents; /* Dimensions du texte */ + gint x_advance; /* Dimensions du texte */ }; @@ -83,6 +83,7 @@ struct _GBufferSegmentClass GObjectClass parent; /* A laisser en premier */ cairo_t *font_ctxts[CAIRO_FONTS_COUNT]; /* Contextes de police */ + double x_advances[CAIRO_FONTS_COUNT]; /* Largeurs par caractère */ rendering_pattern_t patterns[RTT_COUNT];/* Modèles d'impression */ }; @@ -95,7 +96,7 @@ static void g_buffer_segment_class_init(GBufferSegmentClass *); static void g_buffer_segment_init(GBufferSegment *); /* Définit les dernières propriétés de rendu restantes. */ -static void g_buffer_segment_prepare(GBufferSegment *, const char *); +static void g_buffer_segment_prepare(GBufferSegment *, size_t); @@ -122,6 +123,7 @@ static void g_buffer_segment_class_init(GBufferSegmentClass *class) cairo_font_weight_t w; /* Boucle de parcours #2 */ cairo_t **cr; /* Contexte à créer */ cairo_surface_t *surface; /* Surface pour dessin Cairo */ + cairo_text_extents_t extents; /* Couverture des caractères */ /* Contextes pour les mesures initiales */ @@ -140,8 +142,22 @@ static void g_buffer_segment_class_init(GBufferSegmentClass *class) cairo_select_font_face(*cr, "mono", s, w); cairo_set_font_size(*cr, 13); + cairo_text_extents(*cr, "A", &extents); + class->x_advances[CAIRO_FONT_INDEX(s, w)] = extents.x_advance; + + + printf("s=%d w=%d ==>> %g vs %g\n", s, w, + extents.x_advance, class->x_advances[CAIRO_FONT_INDEX(s, w)]); + + printf(" >> %d\n", CAIRO_FONT_INDEX(s, w)); + + + printf("[x] = %g [0] = %g\n", class->x_advances[CAIRO_FONT_INDEX(s, w)], class->x_advances[0]); + } + printf("class=%p [0]=%g\n", class, class->x_advances[0]); + g_free(filename); /* Propriétés d'impression */ @@ -245,7 +261,7 @@ GBufferSegment *g_buffer_segment_new(RenderingTagType type, const char *text, si class = G_BUFFER_SEGMENT_GET_CLASS(result); result->pattern = &class->patterns[type]; - g_buffer_segment_prepare(result, text); + g_buffer_segment_prepare(result, length); g_buffer_segment_set_style(result, SRS_CLASSIC); @@ -267,12 +283,11 @@ GBufferSegment *g_buffer_segment_new(RenderingTagType type, const char *text, si * * ******************************************************************************/ -static void g_buffer_segment_prepare(GBufferSegment *segment, const char *text) +static void g_buffer_segment_prepare(GBufferSegment *segment, size_t length) { GBufferSegmentClass *class; /* Classe associée à l'instance*/ cairo_font_slant_t slant; /* Style d'impression */ cairo_font_weight_t weight; /* Poids de la police */ - cairo_t *cr; /* Contexte de rendu */ /* Taille */ @@ -281,9 +296,7 @@ static void g_buffer_segment_prepare(GBufferSegment *segment, const char *text) slant = segment->pattern->slant; weight = segment->pattern->weight; - cr = class->font_ctxts[CAIRO_FONT_INDEX(slant, weight)]; - - cairo_text_extents(cr, text, &segment->extents); + segment->x_advance = class->x_advances[CAIRO_FONT_INDEX(slant, weight)] * length; /* Couleurs */ @@ -354,7 +367,7 @@ const char *g_buffer_segment_get_text(const GBufferSegment *segment) gint g_buffer_segment_get_width(const GBufferSegment *segment) { - return segment->extents.x_advance; + return segment->x_advance; } @@ -470,7 +483,7 @@ void g_buffer_segment_draw(GBufferSegment *segment, cairo_t *cairo, gint *x, gin segment->cache_bg.green / 65535.0, segment->cache_bg.blue / 65535.0); - cairo_rectangle(cairo, *x, y, segment->extents.x_advance, 17); + cairo_rectangle(cairo, *x, y, segment->x_advance, 17); cairo_set_operator(cairo, CAIRO_OPERATOR_DIFFERENCE); cairo_fill(cairo); @@ -501,13 +514,15 @@ void g_buffer_segment_draw(GBufferSegment *segment, cairo_t *cairo, gint *x, gin cairo_font_extents(cairo, &extents); +#if 1 if (extents.descent != 3) printf("FONT : %g, %g\n", extents.ascent, extents.descent); +#endif cairo_show_text(cairo, segment->text); //printf(">> %s >> %f %f\n", segment->text, segment->extents.width, segment->extents.x_advance); - *x += segment->extents.x_advance; + *x += segment->x_advance; } |