2016-04-18 28 views
6

freetype2とcairoのライブラリしか利用できないシステムがあります。私は何を達成したいことは次のとおりです。cairoとfreetypeによるフォントのレイアウトとレンダリング

をレンダリングするための各グリフについて
  • なっカイロ・パス(自分で)位置情報を格納し、テキストをレイアウトするUTF-8テキスト
  • のためのグリフを取得します

    残念ながら、Pangoのような高レベルのライブラリを使用することを期待しているので、ドキュメンテーションは実際にどのように行うべきか説明していません。私はが正しいことができると思い

    は次のとおりです。cairo_scaled_font_createでスケーリングのフォントを作成し、cairo_scaled_font_text_to_glyphsを使用してテキストのグリフを取得します。 cairo_glyph_extentsは各グリフのエクステントを与えます。しかし、どうやってカーニングや進歩などを得ることができますか?また、どのように各フォントのパスを取得できますか?

    このトピックについてもう少しリソースがありますか?これらの機能は期待される方法ですか?

  • +0

    あなたは[このカイロのドキュメントのページ]を見てきました(http://www.cairographics.org/manual/ cairo-FreeType-Fonts.html)?私はFreeTypeをカイロと一度も使用していないので、それが鍵かどうかは分かりませんが、問題が解決すれば答えとして投稿できます。 – oldtechaa

    +0

    このページでは、フリースタイルフォントを使用して 'cairo_font_face_t'を作成する方法について説明します。次に、このフォントを使用して縮尺設定されたフォントを作成します。そこから途中では不明です。 – maxdev

    +0

    次に、Cairoのテキスト機能を使ってFreeType 'cairo_font_face_t'を使用し、テキストをレイアウトし、レンダリングすることができます。お勧めしません。パンゴの使用に関する[カイロのページ](http://www.cairographics.org/manual/cairo-text.html#cairo-text.description)を参照してください。あなたはPangoも使うことができないので、それはうまくいくはずです。なぜマシンには他のライブラリが用意されていないのですか? – oldtechaa

    答えて

    4

    さて、私は必要なものを見つけました。

    まず、特定のサイズのフォントを表すcairo_scaled_font_tを作成する必要があります。これを行うには、フォントを設定した後にcairo_get_scaled_fontを単に使うことができます。コンテキスト内の現在の設定に合わせた縮尺のフォントを作成します。

    次に、cairo_scaled_font_text_to_glyphsを使用して入力テキストを変換すると、グリフの配列と出力としてのクラスターが得られます。クラスタマッピングは、UTF-8文字列のどの部分がグリフ配列内の対応するグリフに属するかを表します。

    グリフの範囲を取得するには、cairo_scaled_font_glyph_extentsが使用されます。各グリフ/グリフのセットのディメンション、進歩、およびベアリングを提供します。

    最後に、グリフのパスはcairo_glyph_pathを使用してコンテキストに入れることができます。これらのパスは、望むように描画できます。

    次の例では、グリフへの入力文字列を変換し、そのエクステントを取得し、それらをレンダリング:

    const char* text = "Hello world"; 
    int fontSize = 14; 
    cairo_font_face_t* fontFace = ...; 
    
    // get the scaled font object 
    cairo_set_font_face(cr, fontFace); 
    cairo_set_font_size(cr, fontSize); 
    auto scaled_face = cairo_get_scaled_font(cr); 
    
    // get glyphs for the text 
    cairo_glyph_t* glyphs = NULL; 
    int glyph_count; 
    cairo_text_cluster_t* clusters = NULL; 
    int cluster_count; 
    cairo_text_cluster_flags_t clusterflags; 
    
    auto stat = cairo_scaled_font_text_to_glyphs(scaled_face, 0, 0, text, strlen(text), &glyphs, &glyph_count, &clusters, &cluster_count, 
         &clusterflags); 
    
    // check if conversion was successful 
    if (stat == CAIRO_STATUS_SUCCESS) { 
    
        // text paints on bottom line 
        cairo_translate(cr, 0, fontSize); 
    
        // draw each cluster 
        int glyph_index = 0; 
        int byte_index = 0; 
    
        for (int i = 0; i < cluster_count; i++) { 
         cairo_text_cluster_t* cluster = &clusters[i]; 
         cairo_glyph_t* clusterglyphs = &glyphs[glyph_index]; 
    
         // get extents for the glyphs in the cluster 
         cairo_text_extents_t extents; 
         cairo_scaled_font_glyph_extents(scaled_face, clusterglyphs, cluster->num_glyphs, &extents); 
         // ... for later use 
    
         // put paths for current cluster to context 
         cairo_glyph_path(cr, clusterglyphs, cluster->num_glyphs); 
    
         // draw black text with green stroke 
         cairo_set_source_rgba(cr, 0.2, 0.2, 0.2, 1.0); 
         cairo_fill_preserve(cr); 
         cairo_set_source_rgba(cr, 0, 1, 0, 1.0); 
         cairo_set_line_width(cr, 0.5); 
         cairo_stroke(cr); 
    
         // glyph/byte position 
         glyph_index += cluster->num_glyphs; 
         byte_index += cluster->num_bytes; 
        } 
    } 
    
    1

    これらの機能は、カイロのテキストシステムを考えると、最良の方法です。カイロは実際にテキストのために意味されていないことだけを示しています。実際にカーニングやパスを行うことはできません。パンゴは、そうしたことをするための複雑なコードを持っていると私は信じています。

    Ghostを最大限に進めるには、Pangoを移植することをお勧めします。あなた(または他の誰か)がおそらく最終的にそれを望むからです。

    +0

    最新のコメントを見る - 私はカイロにグリフのレイアウト情報とパスを教えて欲しい。この情報は、Pangoがベースになっているため、そこになければなりません。私はそれに関する良い文書を見つけることができません。よく問題になるのは、Pangoには、Ghostには必要のないfontconfig&gnomeライブラリのようなものが必要です。これらのlibsは、私が受け入れたくない設計上の決定を強制し、私のキャラクターをレイアウトするだけです。これまでのところ、ありがとうございました興味を持っていいあなたの助けをありがとう:) – maxdev

    +1

    私はあなたが説明した機能を使用すると言うでしょう。彼らは行く方法のようです。ここでの問題は、カイロが非常に制限されていることです。カーニングやグリフから簡単にパスを作成する明確な方法はありません。 'show_glyphs'や' show_text_glyphs'を使うだけで、グリフを表示することができます。私はもう少し理解する私の答えを編集します。 – oldtechaa

    +0

    他の回答を見て、努力のおかげで! :-) – maxdev

    関連する問題