[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-devel:14020] Re: test packages of gs and gs-aladdin.



佐野@浜松です。

とりあえず、VFlib パッチ無しの gs 5.50 で CID フォントを使って
日本語 PS をある程度表示できるようになりました。

In <20010405232203M.kgh12351@xxxxxxxxxxxxxxxxxxxx>,
 on "Thu, 5 Apr 2001 23:24:20 +0900", I wrote:

> うーむ。でも gs-aladdin 6.50 を使っても CID フォントの
> WadaMin-Regular とかでちゃんと日本語を表示できてない
> ような気がする。
> 
> うーむ。手元の WadaMin-Regular が壊れているのだろうか。

どうやらこれも原因のひとつだったようです。

 1. 入手する。

    ftp://ftp.oreilly.com/pub/examples/nutshell/ujip/adobe/

    (下の例に必要なファイルは aj12.tar.Z と samples/WadaMin-Regular です。)

たしか以前ここからもらってきたものだと思うのだけれど、
あらためて頂いてきたら、手元の WadaMin-Regular とは
微妙に違っていて

  *****   *****   *****   *****   *****   *****   *****   ***** 

--- /usr/lib/ghostscript/CIDFont/WadaMin-Regular	Thu Apr  5 17:02:45 2001
+++ /Sub/gs-cid-fonts/CIDFont/WadaMin-Regular	Fri Apr  6 17:22:20 2001
@@ -1,5 +1,10 @@
-<!-- X-URL: ftp://ftp.oreilly.com/pub/examples/nutshell/ujip/adobe/samples/WadaMin-Regular -->
-<BASE HREF="ftp://ftp.oreilly.com/pub/examples/nutshell/ujip/adobe/samples/WadaMin-Regular";>
+%!PS-Adobe-3.0 Resource-CIDFont
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CIDFont (WadaMin-Regular)
+%%Title: (WadaMin-Regular Adobe Japan1 1)
+%%Version: 3.002
+%  (C1E0A0)
 
 /CIDInit /ProcSet findresource begin
 
@@ -20,10 +25,11 @@
 /UIDBase 2483200 def
 /XUID [1 11 2483200] def
 
-/FontInfo 2 dict dup begin
+/FontInfo 3 dict dup begin
   /Notice
     ((c) Copyright 1996 Adobe Systems Incorporated. All rights reserved.) def
   /FullName (WadaMin-Regular) def
+  /FSType 4 def
 end readonly def
 /CIDMapOffset 0 def
 
  *****   *****   *****   *****   *****   *****   *****   ***** 

 diff を取ったらこんな感じでした。で、他の設定をまったく一緒にしても
 "/FontInfo 2 dict" のだとうまくいかなくて "/FontInfo 3 dict" のほうだと
ちゃんと表示されます。

使っている CID font は WadaMin-Regular と WadaMaruGo-Regular です。
最初 WadaMin-RegularH とかの H 付きのを Horizontal かと勘違いして
しまいましたが、あれは HojoKanji の略だったんですね。

 fonts/ には

 WadaMin-Regular-EUC-H:
 ******  ******  ******  ******  ******  ******  ******  ******  ****** 
/WadaMin-Regular-EUC-H
/EUC-H /CMap findresource
[/WadaMin-Regular /CIDFont findresource]
composefont pop
 ******  ******  ******  ******  ******  ******  ******  ******  ****** 

 WadaMaruGo-Regular-EUC-H:
 ******  ******  ******  ******  ******  ******  ******  ******  ****** 
/WadaMaruGo-Regular-EUC-H
/EUC-H /CMap findresource
[/WadaMaruGo-Regular /CIDFont findresource]
composefont pop
 ******  ******  ******  ******  ******  ******  ******  ******  ****** 

などの定義を置いて、例えば

 chkeuc.ps: (EUC-JP encoding です)
 ******  ******  ******  ******  ******  ******  ******  ******  ****** 
%!PS-Adobe-1.0
%%Creator: gothic2ps
%%DocumentFonts: WadaMin-Regular-EUC-H
/ld -12.0 def
/E{ count { gsave show grestore } repeat 0 ld rmoveto } def
/WadaMin-Regular-EUC-H findfont 28 scalefont setfont
%%EndProlog
%%Page: 1 1
/sv save def 48 760 moveto
(これはテストです。)E
()E
showpage sv restore
%Trailer
 ******  ******  ******  ******  ******  ******  ******  ******  ****** 

とかを表示させてみると、Debian 標準の gs_5.50-1 でもちゃんと出せます。

また、xfig で出力した PS ファイルの場合、

 ******  ******  ******  ******  ******  ******  ******  ******  ****** 
% japanese.ps for fig2dev 3.2
%
% This file will inserted into PostScript output by fig2dev
% when Japanese text is included in the file.
% This code try to use HeiseiMin-W3-EUC-H and HeiseiKakuGo-W5-EUC-H
% if Ryumin-Light-EUC-H is not supported.  --- T.Sato, 1999/3/27

/has_morisawa_font true def
FontDirectory /Ryumin-Light-EUC-H known not {
  systemdict /resourcestatus known {
    /Ryumin-Light-EUC-H /Font resourcestatus {
      pop pop
    } {
      /has_morisawa_font false def
    } ifelse
  } if
} if

16 dict begin
  /FontName /CompositeRoman def  /FontType 0 def
  /WMode 0 def    /FMapType 3 def  /FontMatrix matrix def
  /Encoding [0 1] def
  has_morisawa_font {
    /FDepVector [ /Times-Roman findfont
        /Ryumin-Light-EUC-H findfont ] def
  } {
    /FDepVector [ /Times-Roman findfont
        /HeiseiMin-W3-EUC-H findfont ] def
  } ifelse
  FontName currentdict
  end
definefont pop

16 dict begin
  /FontName /CompositeBold def  /FontType 0 def
  /WMode 0 def    /FMapType 3 def  /FontMatrix matrix def
  /Encoding [0 1] def
  has_morisawa_font {
    /FDepVector [ /Times-Bold findfont
        /GothicBBB-Medium-EUC-H findfont ] def
  } {
    /FDepVector [ /Times-Bold findfont
        /HeiseiKakuGo-W5-EUC-H findfont ] def
  } ifelse
  FontName currentdict
  end
definefont pop

% end of japanese.ps
 ******  ******  ******  ******  ******  ******  ******  ******  ****** 

という Postscript コードが入っているせいか、
 HeiseiMin-W3-EUC-H と HeiseiKakuGo-W5-EUC-H の 2 つのフォントを
定義してやらないと Courier で代用されてしまって化けてしまいますが

 HeiseiMin-W3-EUC-H:
 ******  ******  ******  ******  ******  ******  ******  ******  ****** 
/HeiseiMin-W3-EUC-H
/EUC-H /CMap findresource
[/WadaMin-Regular /CIDFont findresource]
composefont pop
 ******  ******  ******  ******  ******  ******  ******  ******  ****** 

 HeiseiKakuGo-W5-EUC-H:
 ******  ******  ******  ******  ******  ******  ******  ******  ****** 
/HeiseiKakuGo-W5-EUC-H
/EUC-H /CMap findresource
[/WadaMaruGo-Regular /CIDFont findresource]
composefont pop
 ******  ******  ******  ******  ******  ******  ******  ******  ****** 

を定義してやればちゃんと表示できました。

 # ghostscript のフォント検索パスにはカレントディレクトリも
 # 含まれているので、テストの時はそっちでやると一般ユーザーで
 # 実行できて便利です。

ただし、これだけでは縦書き PS を扱えていないらしく、
日本語化 gs のサンプルについてくる article9.ps を
うまく表示できません。

ソースからチェックするために  original gs (gs-ja 5.50 の orig.tar.gz) を
自前で build して、/usr/local/share 以下に gs をインストールして試して
いるのですが、 makefile の GENOPT=-DDEBUG と CFLAGS_DEBUG=-g -O を有効に
して make した gs だと gs -E article9.ps した時に、大量のエラーを出して
くれます。

その中で、CMap の EUC-H をロードした直後に出るエラー、
「zgeneric.c の 160 行目で undefined 」というのに注目してみました。

 zgeneric.c の該当する箇所は

   156      switch (r_type(op1)) {
   157          case t_dictionary:
   158              check_dict_read(*op1);
   159              if (dict_find(op1, op, &pvalue) <= 0)
   160                  return_error(e_undefined);
   161              op[-1] = *pvalue;
   162              break;

となっているのですが、試しにダメモトでこれを

   156      switch (r_type(op1)) {
   157          case t_dictionary:
   158              check_dict_read(*op1);
   159              if (dict_find(op1, op, &pvalue) <= 0)
   160                  /* return_error(e_undefined); */
   161                  break;
   162              op[-1] = *pvalue;
   163              break;

として make してみたところ、なんか article9.ps も表示できたっぽい
感じです。あ、正常な表示と比べて見ると、括弧や句読点が抜け落ちて
ますね。まだこのままだと実用的でないなぁ。縦書き用のフォントが
必要なのかな ? gs-ja 5.50 とコードを比べてみると zfont1.c に
違いがあるけど、これを入れてもダメだった。

なお、もちろん

   http://www.sat.t.u-tokyo.ac.jp/~hideyuki/iroiro/gs-CID-V.diff
   http://www.sat.t.u-tokyo.ac.jp/~hideyuki/iroiro/gs-PDF-V.diff

に相当する変更は入れてあります。
  (このメールの最後に diff を添付しておきます)

ということで、たぶん Torsten の gs 5.5 にも上記の  zgeneric.c 
への変更をもうちょっとスマートにしたような変更 (と gs-CID-V.diff 
および gs-PDF-V.diff に相当する PS ファイルの変更) をしてもらえれば、
フォントの設定だけで CID フォントを利用して日本語 PS ファイルを表示
することも不可能ではない (かもしれない)、という感じです。

まあ gs 6.0 や 7.0 などの gs-cjk に比較すると、たぶんいろいろ
バグもあったりするのでしょうけれど、とりあえず暫定対処としては
これくらいの対処でなんとか時間稼ぎしてもいいんじゃないかという
気がします。

さて、誰か BTS report してもらえますか ? 先日 Torsten には gs-ja の
暫定的なリリースの件で私信を送ったけれどいまだに返事をもらえていない
ところから考えて、BTS 経由で要望を送らないと対応してもらえそうにない
という気がしています。よろしく。

 *** gs-CID-V.diff + gs-PDF-V.diff に相当する PS ファイルの変更 ***
diff -u 5.50.orig/gs_cidfn.ps 5.50/gs_cidfn.ps
--- 5.50.orig/gs_cidfn.ps	Fri Apr  6 17:28:49 2001
+++ 5.50/gs_cidfn.ps	Fri Apr  6 15:49:36 2001
@@ -354,9 +354,43 @@
   exch dup /Private get begin .loadsubrs end
   3 -1 roll //.cid0buildstring cvs cvn 3 1 roll
   dup /CharStrings get 3 index 4 -1 roll put
-  setfont
-  1000 0 setcharwidth	%**** WRONG ****
-  0 0 moveto glyphshow
+  %
+  % 01/16/98 katayama@xxxxxxxxxxxxxxx
+  %   I am not sure whether the following implementation is correct or
+  %   not. But it seems that Acrobat 3.0J does similar things.
+  %
+  % setfont
+  % 1000 0 setcharwidth       %**** WRONG ****
+  % check if writing vertical or not.
+  rootfont /WMode known 
+   { rootfont /WMode get 1 eq { true }{ false } ifelse
+   }
+   { false
+   }
+  ifelse
+  % <font> <isVMode?>
+  exch setfont
+  % <isVMode?>
+   { % vx: a half of w0x
+     gsave
+       nulldevice
+       0 0 moveto dup glyphshow currentpoint pop 2 div
+     grestore
+     % vy: the typical value
+     880
+     % w1x, w1y: the typical values
+     0 -1000 setcharwidth
+     exch neg exch neg moveto
+     glyphshow
+   }
+   { gsave
+       nulldevice
+       0 0 moveto dup glyphshow currentpoint pop
+     grestore
+     0 setcharwidth
+     0 0 moveto glyphshow
+   }
+  ifelse
 } ifelse	%**** WRONG ****
   end
   .setglobal
diff -u 5.50.orig/gs_cmap.ps 5.50/gs_cmap.ps
--- 5.50.orig/gs_cmap.ps	Fri Apr  6 17:28:49 2001
+++ 5.50/gs_cmap.ps	Fri Apr  6 16:47:40 2001
@@ -106,13 +106,22 @@
    ifelse
  } bind def
 /.endmap		% <map> .endmap <map>
- { dup type /arraytype eq { dup { .endmap exch } forall astore readonly } if
+ { dup type /arraytype eq {
+       % This might be a shared read-only array inherited via usecmap.
+       % Don't try to update its elements if this is the case.
+       dup wcheck {
+         dup { .endmap exch } forall astore readonly
+       } if
+    } if
  } bind def
 
+
 /usecmap		% <CMap_name> usecmap -
  { /CMap findresource
-   dup length dict .copydict
-   currentdict end exch .copydict begin
+%   dup length dict .copydict
+%   currentdict end exch .copydict begin
+    dup /.CodeMaps get dup length array copy /.CodeMaps exch def
+    /.FontIndices get /.FontIndices exch def
  } bind def
 
 % ------ Rearranged font operators ------ %
diff -u 5.50.orig/pdf_font.ps 5.50/pdf_font.ps
--- 5.50.orig/pdf_font.ps	Fri Apr  6 17:28:49 2001
+++ 5.50/pdf_font.ps	Fri Apr  6 15:49:36 2001
@@ -467,6 +467,7 @@
       resolvestream
     } ifelse
   def
+  /CMap load /WMode .knownget { /WMode exch def } if
   FontName currentdict end definefont exch pop
 } bdef
 
diff -u 5.50.orig/pdf_ops.ps 5.50/pdf_ops.ps
--- 5.50.orig/pdf_ops.ps	Fri Apr  6 17:28:49 2001
+++ 5.50/pdf_ops.ps	Fri Apr  6 15:49:36 2001
@@ -323,7 +323,13 @@
    2 copy /TextOrigin load astore pop moveto
  } bdef
 /TD { dup neg /TextLeading gput Td } bdef
-/T* { 0 TextLeading neg Td } bdef
+
+%
+% 12/18/97 katayama@xxxxxxxxxxxxxxx
+%
+% /T* { 0 TextLeading neg Td } bdef
+/T* { isVMode { TextLeading neg 0 }{ 0 TextLeading neg } ifelse Td } bdef
+
 /Tm
  { TextMatrix astore pop settextstate
    0 0 /TextOrigin load astore pop
@@ -332,6 +338,13 @@
 
 % ---------------- Text painting ---------------- %
 
+%
+% 12/18/97 katayama@xxxxxxxxxxxxxxx
+%
+/isVMode {
+  rootfont /WMode .knownget { 1 eq { true }{ false } ifelse }{ false } ifelse
+} bind def
+
 /textrenderingprocs [		% (0 is handled specially)
    { tf } { tS } { tB } { tn }
 	% We don't know what the clipping modes mean....
@@ -346,10 +359,22 @@
     }
     { TextRenderingMode 0 eq
        { WordSpacing 0 eq
-          { { setfillcolor TextSpacing exch 0 exch ashow } }
+          %
+          % 12/18/97 katayama@xxxxxxxxxxxxxxx
+          %
+          % { { setfillcolor TextSpacing exch 0 exch ashow } }
+          { { setfillcolor TextSpacing exch 0 exch isVMode { 3 1 roll exch 3 2 roll } if ashow } }
 	  { TextSpacing 0 eq
-	     { { setfillcolor WordSpacing exch 0 exch 32 exch widthshow } }
-	     { { setfillcolor WordSpacing exch TextSpacing exch 0 32 4 2 roll 0 exch awidthshow } }
+	     %
+	     % 12/18/97 katayama@xxxxxxxxxxxxxxx
+	     %
+	     % { { setfillcolor WordSpacing exch 0 exch 32 exch widthshow } }
+	     { { setfillcolor WordSpacing exch 0 exch 32 exch isVMode { 4 2 roll exch 4 2 roll } if widthshow } }
+	     %
+	     % 12/18/97 katayama@xxxxxxxxxxxxxxx
+	     %
+	     % { { setfillcolor WordSpacing exch TextSpacing exch 0 32 4 2 roll 0 exch awidthshow } }
+	     { { setfillcolor WordSpacing exch TextSpacing exch 0 32 4 2 roll 0 exch isVMode { 6 1 roll exch 6 3 roll exch 6 2 roll } if awidthshow } }
 	    ifelse
 	  }
 	 ifelse
@@ -361,7 +386,11 @@
 			% Stack: string xword xchar
 	    { pop pop (x) dup 0 3 index put false charpath
 			% Stack: xword xchar ccode
-	      3 copy 32 eq { add } { exch pop } ifelse 0 rmoveto pop
+	      %
+	      % 12/18/97 katayama@xxxxxxxxxxxxxxx
+	      %
+	      % 3 copy 32 eq { add } { exch pop } ifelse 0 rmoveto pop
+	      3 copy 32 eq { add } { exch pop } ifelse 0 isVMode { exch } if rmoveto pop
 	    }
 	   4 -1 roll cshow pop pop
 	   textrenderingprocs TextRenderingMode get exec
@@ -382,7 +411,12 @@
        }
        { -1000 div
 	 currentfont /ScaleMatrix .knownget { 0 get mul } if
-	 0 rmoveto
+
+       %
+       % 12/18/97 katayama@xxxxxxxxxxxxxxx
+       % 0 rmoveto
+         0 isVMode { exch } if rmoveto
+
        }
       ifelse
     }


--
     # (わたしのおうちは浜松市、「夜のお菓子」で有名さ。)
    <kgh12351@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)