Hi, > I have seen some reports about such problems, with glyphs partially > overlapping, not completely superimposed. Is that what you are seeing? A > screenshot helps. In the past, it always looked like a font problem and Here's both a trimmed down test case that shows the problem, and a screenshot of its output. Maybe you can spot if I'm doing something wrong here. > people reported that switching to another CJK font fixed it. I have heard > this issue reported in conjunction with one of default Vista fonts even. I I am on Linux, using whatever font Pango's using by default. I'll try working out how to install another font and see if the problem persists. Thanks
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <math.h>
#include <cairo/cairo.h>
#include <pango/pango.h>
#include <pango/pangocairo.h>
/* comment/uncomment each of these to render in various ways */
#define VERTICAL
#define RENDER_LINE_BY_LINE
//#define ROTATE_WITH_PANGO
#define SIMPLE_LAYOUT
/* uncomment one of them */
//static const char *text="���";
//static const char *text "(æ?¥æ?¬èª?) ã??ã??ã?«ã?¡ã?¯, コï¾?ï¾?ï¾?ï¾?";
static const char *text="Katakana 1 ゴウジス";
int main()
{
cairo_surface_t *cs=cairo_image_surface_create(CAIRO_FORMAT_ARGB32,640,480);
PangoLayoutIter *iter;
cairo_t *cr=cairo_create(cs);
#ifdef SIMPLE_LAYOUT
PangoLayout *layout=pango_cairo_create_layout(cr);
PangoContext *context=pango_layout_get_context(layout);
#else
PangoFontMap *font_map=pango_cairo_font_map_new();
PangoContext *context=pango_cairo_font_map_create_context((PangoCairoFontMap*)font_map);
PangoLayout *layout=pango_layout_new(context);
#endif
pango_layout_set_markup(layout,text,-1);
cairo_set_source_rgba(cr,1,1,1,1);
cairo_translate(cr,320,100);
#ifdef VERTICAL
pango_context_set_base_gravity(context,PANGO_GRAVITY_AUTO);
#ifdef ROTATE_WITH_PANGO
{
PangoMatrix m=PANGO_MATRIX_INIT;
pango_matrix_rotate(&m,90);
pango_context_set_matrix(context,&m);
}
#else
cairo_rotate(cr,M_PI/2.0);
pango_cairo_update_context(cr,context);
#endif
pango_layout_context_changed(layout);
#endif
cairo_save(cr);
cairo_set_operator(cr,CAIRO_OPERATOR_SOURCE);
cairo_set_source_rgba(cr,0,0,0,0);
cairo_paint(cr);
cairo_restore(cr);
printf("gravity: base %d, for matrix %d, resolved %d\n",
pango_context_get_base_gravity(context),
pango_gravity_get_for_matrix(pango_context_get_matrix(context)),
pango_context_get_gravity(context));
#ifdef RENDER_LINE_BY_LINE
iter=pango_layout_get_iter(layout);
do {
PangoLayoutLine *line=pango_layout_iter_get_line_readonly(iter);
pango_cairo_show_layout_line(cr,line);
} while (pango_layout_iter_next_line(iter));
pango_layout_iter_free(iter);
#else
pango_cairo_show_layout(cr,layout);
#endif
g_object_unref(layout);
cairo_surface_flush(cs);
cairo_destroy(cr);
if (cairo_surface_write_to_png(cs,"vertical.png")!=CAIRO_STATUS_SUCCESS) {
fprintf(stderr,"png write trouble\n");
}
cairo_surface_destroy(cs);
return 0;
}
Attachment:
vertical.png
Description: PNG image