sunmoon1997 发表于 2005-10-26 21:38:19

a testcase.

#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;
}

mandrakechina 发表于 2005-10-27 00:39:51

没编译,不过竖写文字中,可能要考虑对中文和日文区别对待,英文的旋转方向也必须正确选择,而且还要能够对标点符号进行自动替换。工程量不小。

sunmoon1997 发表于 2005-10-27 12:46:28

贴个图 :P

mandrakechina 发表于 2005-10-27 19:25:26

我早就说过,效果肯定不对。这才是正确的效果。国家标准对这个还有更加复杂的要求,比如数字的用法。

sunmoon1997 发表于 2005-10-27 20:30:16

我早就说过,效果肯定不对。这才是正确的效果。国家标准对这个还有更加复杂的要求,比如数字的用法。
呵呵, 这对 cairo 来说就是正确的。为什么了?
因为在 cairo 中, 它只做一些相对底层的东西, 比如竖写它只要做到把文字垂直放
置就可以了。而要希望要我们要的竖写效果,就要更高层的 pango 的实现了。当然
要完整的实现中文的竖写相当复杂。 而且,在我看来标点符号的问题也不应该由
pango 来处理的, 而是再高一级,因为毕竟 pango 不是 office。 功能是一层一
层来实现的, 你不能一吞掉一头大象。

mandrakechina 发表于 2005-10-27 20:52:32

所以我说在cairo中做汉字旋转的补丁没有什么意义,因为汉字本来就不旋转。不过,如果让cairo能够很好的处理标点符号的位置问题倒是值得研究,竖写和横写时标点符号glyph的位置不同。横写时,glyph画在左下角;竖写时,glyph画在右上角。遗憾的是,在Unicode中,这两种标点符号没有进行区分,都是一个逗号(句号什么的也是)。但这样会引入繁体习惯的问题,因为在台湾那边,标点符号统一写在正中间,横写竖写都一样。

Pango上边就是Application了,没法再抽象了。

sunmoon1997 发表于 2005-10-27 20:59:21

前面我都说过了我写的补丁不是汉字旋转补丁。。。怎么就不能理解了。。。
标点符号的位置也不是 cairo 要处理的问题。
横竖标点的符号的问题就给是应用程序处理的。

hzhr 发表于 2005-10-28 00:31:06

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>

sunmoon1997 发表于 2005-10-28 06:52:37

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 没用,我也没办法:)

hzhr 发表于 2005-10-28 22:16:48


对 cairo 没用,我也没办法:)
就是要打补丁让 cairo 读一下 fontconfig 的这段配置。

xLoneStar 发表于 2005-10-29 11:58:11


对 cairo 没用,我也没办法:)
就是要打补丁让 cairo 读一下 fontconfig 的这段配置。

我也很期待!

sunmoon1997 发表于 2005-10-29 15:03:03


对 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?

mandrakechina 发表于 2005-10-29 15:58:40

I've alreday opened the bug report at 317121. Patch appened.
页: 1 [2]
查看完整版本: gnome 面板放置在左/右时,它上面中文显示正常吗?