#include <cairo.h>
#include <cairo-ft.h>
#include <math.h>
#define WIDTH 40
#define HEIGHT 180
#define TEXT " cairo 竖写文字测试"
int main() {
cairo_surface_t * sr;
cairo_t * cr;
cairo_font_face_t * font_face;
cairo_matrix_t font_matrix;
cairo_text_extents_t extents;
cairo_font_options_t *options;
double y = 0;
FcPattern * pattern, * resolved;
FcResult result;
pattern = FcPatternCreate ();
#if 0
FcPatternAddString (pattern, FC_FAMILY, (FcChar8 *)"bitstream vera sans");
#else
FcPatternAddString (pattern, FC_FAMILY, (FcChar8 *)"sans");
#endif
FcConfigSubstitute (NULL, pattern, FcMatchPattern);
FcDefaultSubstitute (pattern);
resolved = FcFontMatch (NULL, pattern, &result);
/* vertical layout */
FcPatternDel (resolved, FC_VERTICAL_LAYOUT);
FcPatternAddBool (resolved, FC_VERTICAL_LAYOUT, FcTrue);
font_face = cairo_ft_font_face_create_for_pattern (resolved);
cairo_matrix_init_scale (&font_matrix, 14.0, 14.0);
sr = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,WIDTH, HEIGHT);
cr = cairo_create (sr);
cairo_set_font_face (cr, font_face);
cairo_set_font_matrix (cr,&font_matrix);
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
cairo_paint(cr);
cairo_set_source_rgb (cr, 0, 0, 1.0);
cairo_text_extents (cr, TEXT, &extents);
cairo_move_to (cr, -extents.x_bearing, y - extents.y_bearing);
cairo_show_text (cr, TEXT);
cairo_surface_write_to_png (sr, "cairo-vertical-layout-text.png");
FcPatternDestroy (pattern);
FcPatternDestroy (resolved);
cairo_font_face_destroy (font_face);
cairo_destroy (cr);
cairo_surface_destroy (sr);
return 0;
}
没编译,不过竖写文字中,可能要考虑对中文和日文区别对待,英文的旋转方向也必须正确选择,而且还要能够对标点符号进行自动替换。工程量不小。 贴个图 :P 我早就说过,效果肯定不对。这才是正确的效果。国家标准对这个还有更加复杂的要求,比如数字的用法。 我早就说过,效果肯定不对。这才是正确的效果。国家标准对这个还有更加复杂的要求,比如数字的用法。
呵呵, 这对 cairo 来说就是正确的。为什么了?
因为在 cairo 中, 它只做一些相对底层的东西, 比如竖写它只要做到把文字垂直放
置就可以了。而要希望要我们要的竖写效果,就要更高层的 pango 的实现了。当然
要完整的实现中文的竖写相当复杂。 而且,在我看来标点符号的问题也不应该由
pango 来处理的, 而是再高一级,因为毕竟 pango 不是 office。 功能是一层一
层来实现的, 你不能一吞掉一头大象。 所以我说在cairo中做汉字旋转的补丁没有什么意义,因为汉字本来就不旋转。不过,如果让cairo能够很好的处理标点符号的位置问题倒是值得研究,竖写和横写时标点符号glyph的位置不同。横写时,glyph画在左下角;竖写时,glyph画在右上角。遗憾的是,在Unicode中,这两种标点符号没有进行区分,都是一个逗号(句号什么的也是)。但这样会引入繁体习惯的问题,因为在台湾那边,标点符号统一写在正中间,横写竖写都一样。
Pango上边就是Application了,没法再抽象了。 前面我都说过了我写的补丁不是汉字旋转补丁。。。怎么就不能理解了。。。
标点符号的位置也不是 cairo 要处理的问题。
横竖标点的符号的问题就给是应用程序处理的。 Well done! sunmoon1997!
能不能再研究一下,怎么让下列代码工作正常?即通过fontconfig替换字体的大小。
<match target="font" >
<test qual="any" name="family" compare="eq">
<string>SimSun</string>
<string>NSimSun</string>
<string>宋体</string>
<string>新宋体</string>
</test>
<test name="pixelsize" compare="more_eq">
<!--int>10</int-->
<double>10.6</double>
</test>
<test name="pixelsize" compare="less">
<int>12</int>
</test>
<edit name="pixelsize" mode="assign">
<int>12</int>
</edit>
</match>
Well done! sunmoon1997!
能不能再研究一下,怎么让下列代码工作正常?即通过fontconfig替换字体的大小。
<match target="font" >
<test qual="any" name="family" compare="eq">
<string>SimSun</string>
<string>NSimSun</string>
<string>宋体</string>
<string>新宋体</string>
</test>
<test name="pixelsize" compare="more_eq">
<!--int>10</int-->
<double>10.6</double>
</test>
<test name="pixelsize" compare="less">
<int>12</int>
</test>
<edit name="pixelsize" mode="assign">
<int>12</int>
</edit>
</match>
对 cairo 没用,我也没办法:)
对 cairo 没用,我也没办法:)
就是要打补丁让 cairo 读一下 fontconfig 的这段配置。
对 cairo 没用,我也没办法:)
就是要打补丁让 cairo 读一下 fontconfig 的这段配置。
我也很期待!
对 cairo 没用,我也没办法:)
就是要打补丁让 cairo 读一下 fontconfig 的这段配置。
我也很期待!
fixed in pango.
http://www.magiclinux.org/people/sunmoon1997/patches/pango/pangocairo-fcfont.diff
will you file a bug in bugzilla against pango? I've alreday opened the bug report at 317121. Patch appened.
页:
1
[2]