忍者ブログ

素人翻訳

適当に翻訳する。

freetype2 のヘッダが見つからない

 xpdf-3.04 をソースコードから作ろうとしたら、configureで1回、makeで1回引っかかった。

 configure では、freetypeとfreetype2の両方ともインストールされていたのに、どちらも検知されなかった。

 config.logには次のような出力があった。

...
...
configure:7453: checking whether to use freetype2 library
configure:7460: result: maybe
configure:7509: checking where to find the freetype2 header files
configure:7516: result:
configure:7535: checking ft2build.h usability
configure:7535: gcc -std=gnu99 -c -g -O2 conftest.c >&5
In file included from conftest.c:67:
/usr/include/ft2build.h:56:38: error: freetype/config/ftheader.h: No such file or directory
...
...

 ft2build.hには、「#include <freetype/config/ftheader.h>」と書かれているが、「/usr/include/freetype」と「/usr/include/freetype2/freetype」の2つがあって、freetype2の方が要るようだ。

 ft2build.h を書き換えて、

...
//#include <freetype/config/ftheader.h>
#include <freetype2/freetype/config/ftheader.h>
...

 これで configure のエラーは消えた。

[AAA@localhost xpdf-3.04]$ make
cd goo; make
make[1]: ディレクトリ `/home/AAA/xpdf/xpdf-3.04/goo' に入ります
...
...
SplashFTFont.cc:18:22: error: freetype/ftoutln.h: そのようなファイルやディレクトリはありません
SplashFTFont.cc:19:20: error: freetype/ftsizes.h: そのようなファイルやディレクトリはありません
SplashFTFont.cc:20:20: error: freetype/ftglyph.h: そのようなファイルやディレクトリはありません
...
...
SplashFTFont.cc:426: error: ‘pt’ was not declared in this scope
make[1]: *** [SplashFTFont.o] エラー 1
make[1]: ディレクトリ `/home/AAA/xpdf/xpdf-3.04/splash' から出ます
make: *** [all] エラー 2
[AAA@localhost xpdf-3.04]$

 freetype2のヘッダの多くは、「ft2build.h」だけを取り込んでおり、「ft2build.h」は「ftheader.h」だけを取り込んでいる。

 そこで「ftheader.h」のなかの「<freetype/......>」を全て「<freetype2/freetype/......>」に書き換えてしまうことにした。

---------------

ftheader.h = (/usr/include/freetype2/freetype/config)

...
110:#define FT_CONFIG_CONFIG_H <freetype2/freetype/config/ftconfig.h>
125:#define FT_CONFIG_STANDARD_LIBRARY_H <freetype2/freetype/config/ftstdlib.h>
140:#define FT_CONFIG_OPTIONS_H <freetype2/freetype/config/ftoption.h>
156:#define FT_CONFIG_MODULES_H <freetype2/freetype/config/ftmodule.h>
...
...
759:#define FT_CACHE_INTERNAL_SBITS_H <freetype2/freetype/ftcache.h>
762:#define FT_INCREMENTAL_H <freetype2/freetype/ftincrem.h>
764:#define FT_TRUETYPE_UNPATENTED_H <freetype2/freetype/ttunpat.h>
772:#define FT_INTERNAL_INTERNAL_H <freetype2/freetype/internal/internal.h>
...

 これで xpdf-3.04 の構築に成功。

 make install で「pdftohtml」と「pdftopng」がインストールできなかった。実行ファイルは作成されていたので手動でコピー。

[AAA@localhost xpdf-3.04]$ sudo cp xpdf/pdftohtml /usr/local/bin [AAA@localhost xpdf-3.04]$ sudo cp xpdf/pdftopng /usr/local/bin [AAA@localhost xpdf-3.04]$
PR

X11、INCR プロパティを用いたセレクション・データの転送

 X11には、クライアント間通信の仕組みとして、セレクション機構が用意されている。

 セレクション機構を使ってクライアント間でデータを転送する時、転送するデータが大き過ぎるなら、分割して転送する。これは Incremental 転送と呼ばれる。INCR という型のプロパティを用いる。

 INCR プロパティを用いたセレクション・データの転送は、以下の手順で行う(図の後に説明がある)。

(1)要求者→Xサーバ[XConvertSelection]
  セレクションを要求するクライアント(要求者)が関数 XConvertSelection を呼び出す。これによって、セレクション・データが欲しいことを X サーバに伝える。(要求者が XSelectInput を使って SelectionNotify イベントの配信を依頼する必要はない。)
(2)Xサーバ→所有者[SelectionRequest]
  X サーバは、セレクション・データの要求があったことをセレクションの所有者に伝える為に SelectionRequest イベントを発行する。
(3)所有者→Xサーバ[XChangeProperty]
  セレクションの所有者は、通常、関数 XChangeProperty を用いて、指定されたウィンドウの指定されたプロパティに指定された型でセレクション・データを格納する。しかし、セレクションの中身のデータ量が一度に転送できる分量より多い場合、先ずセレクション・データの大きさを伝えるために、関数 XChangeProperty を用いて、指定されたウィンドウの指定されたプロパティに INCR 型で(int整数で)セレクション・データの大きさを格納する。
(4)所有者→Xサーバ[XSelectInput]
  同時にセレクションの所有者は XSelectInput を用いて、X サーバに PropertyNotify イベントの配信を依頼する。
(5)所有者→Xサーバ[XSendEvent]
  さらに、セレクションの所有者は、どこのウィンドウの何というプロパティに INCR 型のデータを格納したのかを XSelectionEvent 構造体に記述し、これを要求者へ届けるよう XSendEvent で X サーバに依頼する。
(6)Xサーバ→要求者[SelectionNotify]
  X サーバは、XSendEvent を受けて、SelectionNotify イベントを要求者に転送する。
(7)要求者→Xサーバ[XSelectInput]
  セレクションの要求者は、受け取った SelectionNotify イベントを見て、指定したプロパティに格納されているのが INCR 型の整数値であることを知る。そして、Incremental 転送(分割転送)を開始するべく、PropertyChangeMask を指定して XSelectInput を呼び出す。
(8)要求者→Xサーバ[XDeleteProperty]
  セレクションの要求者は次いで、XDeleteProperty を呼び出し、INCR 型データの入ったプロパティを削除するよう X サーバに依頼する。
(9)Xサーバ→所有者→Xサーバ[PropertyNotify、XChangeProperty]
  「state」に PropertyDelete が入った PropertyNotify イベントを初めて受け取った所有者は、引数 mode に PropModeReplace を指定して関数 XChangeProperty を呼び出し、最初の SelectionRequest で指定されたウィンドウ、プロパティ、型に従ってセレクション・データの一部を書き込む。
---以下繰り返し---
(10)Xサーバ→要求者→Xサーバ→要求者[PropertyNotify、XGetWindowProperty]
  「state」に PropertyNewValue が入った PropertyNotify イベントを受け取った要求者は、引数 delete に True を指定して関数 XGetWindowProperty を呼び出し、新たに書き込まれたデータを読み込む。この時、取得したデータの長さが 0 であれば、前回の転送でセレクション・データを全て取得し終えたということなので、この繰り返しから抜ける。
(11)Xサーバ→所有者→Xサーバ[PropertyNotify、XChangeProperty]
  「state」に PropertyDelete が入った PropertyNotify イベントを受け取った所有者は、引数 mode に PropModeAppend を指定して関数 XChangeProperty を呼び出し、データの続きの一部を上と同じプロパティに書き込む。但し、前回の転送で全データの引き渡しが済んでいた場合、同プロパティには長さ 0 のデータ(NULL)を書き込む。
---繰り返しここまで---
(12)要求者→Xサーバ[XDeleteProperty]
  長さ 0 のデータを受け取った要求者は、関数 XDeleteProperty を呼び出し、使用したプロパティを削除する。
(13)終わり。

 xsel-1.2.0 では、所有者は全データの転送完了後に property 部が None の XSelectionEvent 構造体を使用して SelectionNotify を送信している。多分、送信しなくても良い。分割転送が途中で失敗した場合は、SelectionNotify で通知する。

★★★

 INCR Property、Selection Mechanism、Incremental Transfer、セレクション・メカニズム、順次転送、分割転送

カレンダー

06 2025/07 08
S M T W T F S
2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

最新コメント

[09/07 NONAME]
[08/18 NONAME]
[05/18 NONAME]
[04/09 NONAME]
[03/21 NONAME]

最新記事

(07/01)
(01/10)
(01/03)
(12/20)
(12/08)
(11/20)
(10/30)
(10/24)
(09/20)
(09/16)
(09/11)
(09/03)
(09/02)
(08/27)
(08/17)
(07/31)
(07/30)
(07/19)
(07/13)
(05/02)
(03/17)
(11/01)
(07/20)
(05/17)
(04/20)

ブログ内検索

広告

バーコード

広告