6

チュートリアルの Xft を使用しようとしましたが、それをチュートリアルと呼んでもらいました...北朝鮮のキャンプで書かれたようです...これも見つけまし。それでは、ステップバイステップでやってみましょう:

// g++ XftTest.cc -lX11 -lXft `pkg-config --cflags freetype2`
#include<unistd.h>
#include<X11/Xlib.h>
#include<X11/Xutil.h>
#include<X11/Xft/Xft.h>
int main()
{
  Display *display;
  XftFont      *font;
  XftDraw      *xftdraw;
  XRenderColor xrcolor;
  XftColor     xftcolor;

  display = XOpenDisplay(0);
  Window XP = XCreateSimpleWindow(display,DefaultRootWindow(display),0,0,360,90,0,0,0);
  XMapWindow(display,XP);

  font = NULL; /* added 6/16 */

  //font = XftFontOpenName(display,0,"NorthKorea-50"); // how to check if this is good ?
  font = XftFontOpenName(display,0,"") /* added 6/16 */
  if (!font) return 1;

  xftdraw = XftDrawCreate(display,XP,DefaultVisual(display,0),DefaultColormap(display,0));

  xrcolor.red  =65535;
  xrcolor.green=0;
  xrcolor.blue =0;
  xrcolor.alpha=65535;
  XftColorAllocValue(display,DefaultVisual(display,0),DefaultColormap(display,0),&xrcolor,&xftcolor);

  XftDrawString8(xftdraw, &xftcolor, font, 20,70 , (XftChar8 *)"Joe Dalton", 10);

  XFlush(display);

  sleep(2);

  XftDrawDestroy(xftdraw);
  XftColorFree(display,DefaultVisual(display,0),DefaultColormap(display,0),&xftcolor);

  return 0;
}

ご覧のXftFontOpenNameとおり XftFontOpenName(display,0,"NorthKorea-50") 、私のようにでたらめを書いても、NorthKorea というフォントを持っていないことを伝えるエラーや何かはありません。XftFontOpenName文字列から最も近いフォントを返すため、これは理にかなっています。

では、フォントが一致するかどうかを確認するにはどうすればよいですか? arial のようなフォントを使用するにはどうすればよいですか? XftFontOpenName(display,0,"arial-50") を試してみましたが、違いはありませんでした。

私のシステムでは、これらのフォルダーが fonts フォルダーにあります。

$ls /usr/share/fonts/
100dpi  75dpi  cyrillic  encodings  misc  OTF  TTF  Type1  util

これらのフォルダのフォントを同じ方法で使用できますか?

素敵なインターネット リンクをいくつかお持ちでしたら、ぜひご覧ください。

注意:xftタグはありません...

6/16更新

私はまだそのようなもので立ち往生しています...私が置き換えても理解できません

font = XftFontOpenName(display,0,"NorthKorea-50");

font = XftFontOpenName(display,0,"");

まだフォントをロードしています...

xlsfonts は dat one のように多くのものを返します:

-monotype-courier new-bold-r-normal--0-0-0-0-m-0-iso8859-10

しかし、これを引数として渡してXftFontOpenNameも何も変わりません。私もフォントを読み込もうとしてXftFontOpenXlfdいますが、常に返されますNULL...

4

2 に答える 2

4

xft は、フォントの検出に fontconfig を使用します。xlsfonts は、置き換えられた古い X コア フォント システム fontconfig を照会する方法です。xlsfonts の結果は、信頼できる方法で fontconfig 状態にマップされません。

そう:

  1. 過去数世紀の技術書に記載されている X コア フォント システムのように xft が動作するショートカットについては忘れてください。それは完全に異なります。アンチエイリアシングと truetype をサポートする X コア フォントではありません。これは最新のフォントを使用してアンチエイリアシングを行うことができるものですが、どのような形式の X コア フォントであっても間違いありません。

  2. fontconfig ドキュメント、システム上の fontconfig 構成ファイルを読み、fontconfig ユーティリティ (fc-query、fc-list など) を使用して fontconfig の状態を照会します。

  3. xorg (x コア フォントと fontconfig の両方) を管理している人々が既に言ったように、xft を直接使用しようとしないでください。xft は、新しいフォント スタックを書き込もうとした最初の試みの産物です。その機能は、最新のテキストと最新のフォントを管理するには不十分です。最新のフォント形式の複雑さを扱う部分は、かなり前に pango でスピンアウトされました (別のプロジェクトに値するほど複雑であることが証明されたため)。xft を単独で使用しようとすると、パンゴ以前のコードの欠陥に遅かれ早かれ遭遇することになり、パンゴ側で同じコードがすでに 10 年にわたって修正されているため、誰も問題の修正に関心を示さなくなります。パンゴを避けることは近道ではありません。パンゴを回避することは、何年もの間放棄された、半分完成したプロジェクトに頼ろうとすることです。

  4. 特定のフォント ファイルに一致させることを忘れてください。fontconfig は、この方法で機能しようとするあらゆる試みに積極的に対抗します。コア フォント以降の世界では、フォント システムにフォント パターンを指定すると、一致するフォントが構築されます。結果が期待したフォント ファイルでない場合は、ファイルが評価され、不足していることが判明したためです。fontconfig でこのファイルを使用する場合は、フォント ファイルを修正する必要があります (不足しているグリフやフォント スタイルを追加するなど)。Fontconfig は、ペット フォントができる部分だけをレンダリングするよりも、ユーザーが読めるテキストをレンダリングすることが重要であると考えています。そして、そうです、それはあなたが他のシステムでそれについて考えるのに慣れている方法です. fontconfig が異なります。書き直すだけで、期待どおりに動作するようになります。

于 2013-06-18T18:44:18.217 に答える
0

XftFontOpenName に空の文字列を渡して、フォントと一致することを期待してはいけません。Xft はコア フォントのサポートを提供し、XftFont 内にネストされた構造は XFontStruct と XftFontStruct の和集合です。X11 は、新しいインスタンスを作成するときに XFontStruct のデフォルト フォントを埋めるため、空の文字列の場合、デフォルトのコア フォントを取得する可能性があります。

最も単純なアプローチでは、次のようにフォント名をハードコーディングできます。

const char *font_name = "Arial-20";
XftFont *font = XftFontOpenName (display, DefaultScreen(display), font_name);

または、パターンを XftFontOpenPattern に渡す前に、XftFontMatch を使用して「結果」を確認することもできます。http://keithp.com/~keithp/talks/xtc2001/paper/xft.html#sec-editingを参照してください。

XCloseDisplay がないことに注意してください。

于 2014-12-18T14:14:14.103 に答える