|
Lines 261-266
Link Here
|
| 261 |
} for pop exch pop |
261 |
} for pop exch pop |
| 262 |
} bind def |
262 |
} bind def |
| 263 |
|
263 |
|
|
|
264 |
/.biglength { % <str>|<array of str> .biglength <integer> |
| 265 |
dup type /arraytype eq { 0 exch { length add } forall } { length } ifelse |
| 266 |
} bind def |
| 267 |
|
| 268 |
/concats { % [str ...] concats str |
| 269 |
() exch dup length 1 sub -1 0 { |
| 270 |
1 index exch get dup type /stringtype ne { dup length string cvs } if |
| 271 |
3 -1 roll exch dup length 2 index length add string |
| 272 |
dup dup 4 2 roll copy length 4 -1 roll putinterval exch |
| 273 |
} for pop |
| 274 |
} bind def |
| 275 |
|
| 276 |
% <str>|<array of str> <index> <count> .biggetinterval <str>|<array of str> |
| 277 |
/.biggetinterval { |
| 278 |
3 dict begin |
| 279 |
2 index type /arraytype eq { |
| 280 |
/c exch def |
| 281 |
/i exch def |
| 282 |
[ exch { |
| 283 |
dup length /l exch def |
| 284 |
i c add l gt { |
| 285 |
i l lt { |
| 286 |
i l i sub getinterval |
| 287 |
/c i c add l sub def |
| 288 |
/i 0 def |
| 289 |
} { |
| 290 |
pop |
| 291 |
/i i l sub def |
| 292 |
} ifelse |
| 293 |
} { |
| 294 |
i c getinterval exit |
| 295 |
} ifelse |
| 296 |
} forall |
| 297 |
] dup .biglength 65535 le { concats } if |
| 298 |
} { getinterval } ifelse |
| 299 |
end |
| 300 |
} bind def |
| 301 |
|
| 302 |
% <str>|<array of str> <index> getu16 <integer> |
| 303 |
/.biggetu16 { |
| 304 |
2 .biggetinterval 0 getu16 |
| 305 |
} bind def |
| 306 |
|
| 307 |
% <str>|<array of str> <index> getu32 <integer> |
| 308 |
/.biggetu32 { |
| 309 |
4 .biggetinterval 0 getu32 |
| 310 |
} bind def |
| 311 |
|
| 264 |
% Each procedure in this dictionary is called as follows: |
312 |
% Each procedure in this dictionary is called as follows: |
| 265 |
% <encodingtable> proc <glypharray> |
313 |
% <encodingtable> proc <glypharray> |
| 266 |
/cmapformats mark |
314 |
/cmapformats mark |
|
Lines 351-364
Link Here
|
| 351 |
} bind |
399 |
} bind |
| 352 |
4 { % Microsoft/Adobe segmented mapping. |
400 |
4 { % Microsoft/Adobe segmented mapping. |
| 353 |
/etab exch def |
401 |
/etab exch def |
| 354 |
/nseg2 etab 6 getu16 def |
402 |
/nseg2 etab 6 .biggetu16 def |
| 355 |
14 /endc etab 2 index nseg2 getinterval def |
403 |
14 /endc etab 2 index nseg2 .biggetinterval def |
| 356 |
% The Apple TrueType documentation omits the 2-byte |
404 |
% The Apple TrueType documentation omits the 2-byte |
| 357 |
% 'reserved pad' that follows the endCount vector! |
405 |
% 'reserved pad' that follows the endCount vector! |
| 358 |
2 add |
406 |
2 add |
| 359 |
nseg2 add /startc etab 2 index nseg2 getinterval def |
407 |
nseg2 add /startc etab 2 index nseg2 .biggetinterval def |
| 360 |
nseg2 add /iddelta etab 2 index nseg2 getinterval def |
408 |
nseg2 add /iddelta etab 2 index nseg2 .biggetinterval def |
| 361 |
nseg2 add /idroff etab 2 index nseg2 getinterval def |
409 |
nseg2 add /idroff etab 2 index nseg2 .biggetinterval def |
| 362 |
% The following hack allows us to properly handle |
410 |
% The following hack allows us to properly handle |
| 363 |
% idiosyncratic fonts that start at 0xf000: |
411 |
% idiosyncratic fonts that start at 0xf000: |
| 364 |
pop |
412 |
pop |
|
Lines 370-377
Link Here
|
| 370 |
/numcodes 0 def /glyphs 0 0 2 nseg2 3 sub { |
418 |
/numcodes 0 def /glyphs 0 0 2 nseg2 3 sub { |
| 371 |
% Stack: /glyphs numglyphs i2 |
419 |
% Stack: /glyphs numglyphs i2 |
| 372 |
/i2 exch def |
420 |
/i2 exch def |
| 373 |
/scode startc i2 getu16 def |
421 |
/scode startc i2 .biggetu16 def |
| 374 |
/ecode endc i2 getu16 def |
422 |
/ecode endc i2 .biggetu16 def |
| 375 |
numcodes scode firstcode sub |
423 |
numcodes scode firstcode sub |
| 376 |
% Hack for fonts that have only 0x0000 and 0xf000 ranges |
424 |
% Hack for fonts that have only 0x0000 and 0xf000 ranges |
| 377 |
%dup 16#e000 ge { 255 and } if |
425 |
%dup 16#e000 ge { 255 and } if |
|
Lines 392-399
Link Here
|
| 392 |
/numcodes 0 def /code 0 def |
440 |
/numcodes 0 def /code 0 def |
| 393 |
0 2 nseg2 3 sub { |
441 |
0 2 nseg2 3 sub { |
| 394 |
/i2 exch def |
442 |
/i2 exch def |
| 395 |
/scode startc i2 getu16 def |
443 |
/scode startc i2 .biggetu16 def |
| 396 |
/ecode endc i2 getu16 def |
444 |
/ecode endc i2 .biggetu16 def |
| 397 |
numcodes scode firstcode sub |
445 |
numcodes scode firstcode sub |
| 398 |
% Hack for fonts that have only 0x0000 and 0xf000 ranges |
446 |
% Hack for fonts that have only 0x0000 and 0xf000 ranges |
| 399 |
%dup 16#e000 ge { 255 and } if |
447 |
%dup 16#e000 ge { 255 and } if |
|
Lines 405-419
Link Here
|
| 405 |
(scode=) print scode =only |
453 |
(scode=) print scode =only |
| 406 |
( ecode=) print ecode =only |
454 |
( ecode=) print ecode =only |
| 407 |
( delta=) print delta =only |
455 |
( delta=) print delta =only |
| 408 |
( droff=) print idroff i2 getu16 = |
456 |
( droff=) print idroff i2 .biggetu16 = |
| 409 |
} if |
457 |
} if |
| 410 |
idroff i2 getu16 dup 0 eq { |
458 |
idroff i2 .biggetu16 dup 0 eq { |
| 411 |
pop scode delta add 65535 and 1 ecode delta add 65535 and |
459 |
pop scode delta add 65535 and 1 ecode delta add 65535 and |
| 412 |
{ putglyph } for |
460 |
{ putglyph } for |
| 413 |
} { % The +2 is for the 'reserved pad'. |
461 |
} { % The +2 is for the 'reserved pad'. |
| 414 |
/gloff exch 14 nseg2 3 mul add 2 add i2 add add def |
462 |
/gloff exch 14 nseg2 3 mul add 2 add i2 add add def |
| 415 |
0 1 ecode scode sub { |
463 |
0 1 ecode scode sub { |
| 416 |
2 mul gloff add etab exch getu16 |
464 |
2 mul gloff add etab exch .biggetu16 |
| 417 |
dup 0 ne { delta add 65535 and } if putglyph |
465 |
dup 0 ne { delta add 65535 and } if putglyph |
| 418 |
} for |
466 |
} for |
| 419 |
} ifelse |
467 |
} ifelse |
|
Lines 436-447
Link Here
|
| 436 |
|
484 |
|
| 437 |
% <cmaptab> cmaparray <glypharray> |
485 |
% <cmaptab> cmaparray <glypharray> |
| 438 |
/cmaparray { |
486 |
/cmaparray { |
| 439 |
dup 0 getu16 cmapformats exch .knownget { |
487 |
dup 0 .biggetu16 cmapformats exch .knownget { |
| 440 |
TTFDEBUG { |
488 |
TTFDEBUG { |
| 441 |
(cmap: format ) print 1 index 0 getu16 = flush |
489 |
(cmap: format ) print 1 index 0 .biggetu16 = flush |
| 442 |
} if exec |
490 |
} if exec |
| 443 |
} { |
491 |
} { |
| 444 |
(Can't handle format ) print 0 getu16 = flush |
492 |
(Can't handle format ) print 0 .biggetu16 = flush |
| 445 |
0 1 255 { } for 256 packedarray |
493 |
0 1 255 { } for 256 packedarray |
| 446 |
} ifelse |
494 |
} ifelse |
| 447 |
TTFDEBUG { |
495 |
TTFDEBUG { |
|
Lines 513-525
Link Here
|
| 513 |
% Adobe requirement that each sfnts entry have even length. |
561 |
% Adobe requirement that each sfnts entry have even length. |
| 514 |
/readtables mark |
562 |
/readtables mark |
| 515 |
% Ordinary tables |
563 |
% Ordinary tables |
| 516 |
(cmap) { .readtable } |
564 |
(cmap) { .readbigtable } |
| 517 |
(head) 1 index |
565 |
(head) 1 index |
| 518 |
(hhea) 1 index |
566 |
(hhea) 1 index |
| 519 |
(maxp) 1 index |
567 |
(maxp) 1 index |
| 520 |
(name) 1 index |
568 |
(name) 1 index |
| 521 |
(OS/2) 1 index |
569 |
(OS/2) 1 index |
| 522 |
(post) 1 index |
570 |
(post) { .readbigtable } |
| 523 |
%(vhea) 1 index |
571 |
%(vhea) 1 index |
| 524 |
systemdict /DEVICE .knownget { (pdfwrite) ne } {true} ifelse { |
572 |
systemdict /DEVICE .knownget { (pdfwrite) ne } {true} ifelse { |
| 525 |
(vhea) 1 index % better to be ignored for vertical writing in pdfwrite |
573 |
(vhea) 1 index % better to be ignored for vertical writing in pdfwrite |
|
Lines 867-876
Link Here
|
| 867 |
} ifelse |
915 |
} ifelse |
| 868 |
% Stack: ... /FontInfo mark key1 value1 ... |
916 |
% Stack: ... /FontInfo mark key1 value1 ... |
| 869 |
post null ne { |
917 |
post null ne { |
| 870 |
/ItalicAngle post 4 gets32 65536.0 div |
918 |
post type /arraytype eq { |
| 871 |
/isFixedPitch post 12 getu32 0 ne |
919 |
% this post table is a big table. /post should be [(...) ...] |
| 872 |
/UnderlinePosition post 8 gets16 upem div |
920 |
% data we actually need here should be first one in array. |
| 873 |
/UnderlineThickness post 10 gets16 upem div |
921 |
/posttable post 1 get def |
|
|
922 |
} { |
| 923 |
/posttable post def |
| 924 |
} ifelse |
| 925 |
/ItalicAngle posttable 4 gets32 65536.0 div |
| 926 |
/isFixedPitch posttable 12 getu32 0 ne |
| 927 |
/UnderlinePosition posttable 8 gets16 upem div |
| 928 |
/UnderlineThickness posttable 10 gets16 upem div |
| 874 |
} if |
929 |
} if |
| 875 |
counttomark 0 ne { .dicttomark } { pop pop } ifelse |
930 |
counttomark 0 ne { .dicttomark } { pop pop } ifelse |
| 876 |
/XUID [orgXUID 42 curxuid] |
931 |
/XUID [orgXUID 42 curxuid] |
|
Lines 929-950
Link Here
|
| 929 |
} if |
984 |
} if |
| 930 |
tabdict /cmap get % bool [] i PlatID SpecID (cmap) |
985 |
tabdict /cmap get % bool [] i PlatID SpecID (cmap) |
| 931 |
dup /cmaptab exch def % temporary |
986 |
dup /cmaptab exch def % temporary |
| 932 |
0 1 2 index 2 getu16 1 sub { % bool [] i PlatID SpecID (cmap) j |
987 |
0 1 2 index 2 .biggetu16 1 sub { % bool [] i PlatID SpecID (cmap) j |
| 933 |
8 mul 4 add 1 index exch 8 getinterval % bool [] i PlatID SpecID (cmap) (cmapsub) |
988 |
8 mul 4 add 1 index exch 8 .biggetinterval % bool [] i PlatID SpecID (cmap) (cmapsub) |
| 934 |
TTFDEBUG { |
989 |
TTFDEBUG { |
| 935 |
(cmap: platform ) print dup 0 getu16 =only |
990 |
(cmap: platform ) print dup 0 .biggetu16 =only |
| 936 |
( encoding ) print dup 2 getu16 = flush |
991 |
( encoding ) print dup 2 .biggetu16 = flush |
| 937 |
} if |
992 |
} if |
| 938 |
dup 0 getu16 4 index eq { |
993 |
dup 0 .biggetu16 4 index eq { |
| 939 |
dup 2 getu16 3 index eq { % bool [] i PlatID SpecID (cmap) (cmapsub) |
994 |
dup 2 .biggetu16 3 index eq { % bool [] i PlatID SpecID (cmap) (cmapsub) |
| 940 |
TTFDEBUG { |
995 |
TTFDEBUG { |
| 941 |
(Choosen a cmap for platform=) print 3 index =only |
996 |
(Choosen a cmap for platform=) print 3 index =only |
| 942 |
( encoding=) print 2 index = |
997 |
( encoding=) print 2 index = |
| 943 |
} if |
998 |
} if |
| 944 |
/cmapsub 1 index def |
999 |
/cmapsub 1 index def |
| 945 |
dup 4 getu32 % bool [] i PlatID SpecID (cmap) (cmapsub) p |
1000 |
dup 4 .biggetu32 % bool [] i PlatID SpecID (cmap) (cmapsub) p |
| 946 |
cmaptab length 1 index sub % bool [] i PlatID SpecID (cmap) (cmapsub) p l |
1001 |
cmaptab .biglength 1 index sub % bool [] i PlatID SpecID (cmap) (cmapsub) p l |
| 947 |
cmaptab 3 1 roll getinterval |
1002 |
cmaptab 3 1 roll .biggetinterval |
| 948 |
/cmaptab exch def % bool [] i PlatID SpecID (cmap) (cmapsub) |
1003 |
/cmaptab exch def % bool [] i PlatID SpecID (cmap) (cmapsub) |
| 949 |
5 index 5 index 1 add get % bool [] i PlatID SpecID (cmap) (cmapsub) /Decoding |
1004 |
5 index 5 index 1 add get % bool [] i PlatID SpecID (cmap) (cmapsub) /Decoding |
| 950 |
/Decoding exch def % bool [] i PlatID SpecID (cmap) (cmapsub) |
1005 |
/Decoding exch def % bool [] i PlatID SpecID (cmap) (cmapsub) |