[tex-k] Omega dvips patch
Roozbeh Pournader
roozbeh@sharif.edu
Sun, 29 Sep 2002 19:54:21 +0330 (IRT)
Dear all,
Following is a delayed patch for Omega related parts of dvips, which was
most probably forgotten to be sent to Olaf when Omega 1.23 release were
done, and has been the source of many confusions. The patch is done
against the dvipsk sources in TeX Live 7 (5.90a?), but I can redo it if it
cannot be incorporated in the current dvips.
All changes are #ifdef-ed for Omega, or are otherwise clearly
Omega-related. The only exception is a change to 'texps.lpro' which I
don't understand since I don't understand other than it is related to
PostScript Type 0 fonts.
It would be great if this gets incorporated into dvips, web2c, etc. Please
contact me in case of any problems. (And finally sorry for CC-ing the
world, since I'm still in full confusion about who is responsible for
what.)
Roozbeh (for the Omega project)
diff -r -u dvipsk.orig/bbox.c dvipsk/bbox.c
--- dvipsk.orig/bbox.c Sat Sep 21 04:35:29 2002
+++ dvipsk/bbox.c Sat Sep 21 04:55:51 2002
@@ -43,17 +43,23 @@
void bbtfmload P1C(int, n)
{
+#ifdef Omega
+ register integer i, j ;
+#else
register shalfword i ;
+#endif
register integer li ;
integer scaledsize ;
shalfword nw, nh, nd, ns, hd ;
- shalfword bc, ec ;
#ifdef Omega
+ integer bc, ec ;
+ integer nco, ncw, npc, no_repeats ;
integer scaled[65536] ;
unsigned chardat[65536] ;
integer font_level;
integer pretend_no_chars;
#else
+ shalfword bc, ec ;
integer scaled[300] ;
integer chardat[256] ;
#endif
@@ -92,9 +98,12 @@
ns += tfm32() ;
ns += tfm32() ;
li = tfm32() ;
+ li = tfm32() ;
if (font_level==1) {
- fprintf(stderr, "Level 1 Fonts unsupported");
- abort();
+ nco = tfm32() ;
+ ncw = tfm32() ;
+ npc = tfm32() ;
+ for (i=0; i<12; i++) li=tfm32();
}
}
#else
@@ -111,27 +120,49 @@
check_checksum (li, curfnt->checksum, curfnt->name);
li = tfm32() ;
- for (i=2; i<hd; i++)
- li = tfm32() ;
#ifdef Omega
pretend_no_chars=ec+1;
if (pretend_no_chars<256) pretend_no_chars=256;
bbcurfnt->bbchardesc = (bbchardesctype *)
xmalloc(pretend_no_chars*sizeof(bbchardesctype));
+ for (i=2; i<((font_level==1)?nco-29:hd); i++)
+ li = tfm32() ;
+ no_repeats = 0 ;
for (i=0; i<pretend_no_chars; i++)
#else
+ for (i=2; i<hd; i++)
+ li = tfm32() ;
for (i=0; i<256; i++)
#endif
chardat[i] = -1 ;
for (i=bc; i<=ec; i++) {
#ifdef Omega
- chardat[i] = tfm32() ;
- li = tfm32() ;
+ if (no_repeats>0) {
+ chardat[i] = chardat[i-1] ;
+ no_repeats-- ;
+ } else if (font_level>=0) {
+ chardat[i] = tfm32() ;
+ li = tfm32() ;
+ if (font_level==1) {
+ no_repeats = tfm16() ;
+ for (j=0; j<(npc|1); j++) tfm16() ;
+ ncw -= 3 + npc/2 ;
+ }
+ } else {
+ chardat[i] = tfm16() ;
+ li = tfm16() ;
+ }
#else
chardat[i] = tfm16() ;
li = tfm16() ;
#endif
}
+#ifdef Omega
+ if (font_level==1&&ncw!=0) {
+ sprintf(errbuf, "Table size mismatch in %s", curfnt->name) ;
+ error(errbuf) ;
+ }
+#endif
scaledsize = curfnt->scaledsize ;
for (i=0; i<nw + nh + nd; i++)
scaled[i] = scalewidth(tfm32(), scaledsize) ;
diff -r -u dvipsk.orig/dospecial.c dvipsk/dospecial.c
--- dvipsk.orig/dospecial.c Sat Sep 21 04:35:29 2002
+++ dvipsk/dospecial.c Sat Sep 21 04:52:57 2002
@@ -303,6 +303,7 @@
register char *p = nextstring ;
register int i = 0 ;
int j ;
+ static int omega_specials = 0;
if (nextstring + numbytes > maxstring) {
p = nextstring = mymalloc(1000 + 2 * numbytes) ;
@@ -338,6 +339,15 @@
*/
switch (*p) {
+case 'o':
+ if (strncmp(p, "om:", 3)==0) { /* Omega specials ignored */
+ if (omega_specials==0) {
+ fprintf(stderr, "Omega specials are currently ignored\n");
+ omega_specials++;
+ }
+ return;
+ }
+ break ;
case 'l':
if (strncmp(p, "landscape", 9)==0) {
if (hpapersize || vpapersize)
@@ -501,6 +511,11 @@
#endif
switch (*p) {
+case 'o':
+ if (strncmp(p, "om:", 3)==0) { /* Omega specials ignored */
+ return;
+ }
+ break ;
case 'e':
if (strncmp(p, "em:", 3)==0) { /* emTeX specials in emspecial.c */
emspecial(p);
diff -r -u dvipsk.orig/download.c dvipsk/download.c
--- dvipsk.orig/download.c Sat Sep 21 04:35:29 2002
+++ dvipsk/download.c Sat Sep 21 04:52:57 2002
@@ -222,11 +222,13 @@
curfnt->psname = psfont ;
if (curfnt->resfont) {
struct resfont *rf = curfnt->resfont ;
+#ifndef Omega /* from ASCII jpatch */
for (b=0; b<16; b++)
if(p->bitmap[b] !=0)
non_empty =1;
if(non_empty==0)
return;
+#endif
cmdout(name) ;
/* following code re-arranged - Rob Hutchings 1992Apr02 */
c = curfnt->chardesc + 255 ;
diff -r -u dvipsk.orig/dvips.h dvipsk/dvips.h
--- dvipsk.orig/dvips.h Sat Sep 21 04:35:29 2002
+++ dvipsk/dvips.h Sat Sep 21 04:52:57 2002
@@ -194,6 +194,7 @@
quarterword psflag;
#ifdef Omega
chardesctype *chardesc ;
+ quarterword codewidth ;
#else
chardesctype chardesc[256] ;
#endif
diff -r -u dvipsk.orig/fontdef.c dvipsk/fontdef.c
--- dvipsk.orig/fontdef.c Sat Sep 21 04:35:29 2002
+++ dvipsk/fontdef.c Sat Sep 21 04:52:57 2002
@@ -40,6 +40,7 @@
fp = (fontdesctype *)mymalloc((integer)sizeof(fontdesctype)) ;
#ifdef Omega
fp->chardesc = (chardesctype *)mymalloc(256*(integer)sizeof(chardesctype)) ;
+ fp->codewidth = 1 ;
#endif
fp->psname = 0 ;
fp->loaded = 0 ;
diff -r -u dvipsk.orig/output.c dvipsk/output.c
--- dvipsk.orig/output.c Sat Sep 21 04:35:29 2002
+++ dvipsk/output.c Sat Sep 21 04:52:57 2002
@@ -676,6 +676,17 @@
}
}
+#ifdef Omega
+void
+scout2 P1C(int, c)
+{
+ char s[64] ;
+
+ sprintf(s, "<%04x>p", c) ;
+ cmdout(s) ;
+}
+#endif
+
void
cmdout P1C(char *, s)
{
@@ -1478,7 +1489,12 @@
fontout((int)curfnt->psname) ;
lastfont = curfnt->psname ;
}
+#ifdef Omega
+ if (curfnt->codewidth==1) scout((unsigned char)cc) ;
+ else scout2(cc) ;
+#else
scout((unsigned char)cc) ;
+#endif
rhh = hh + c->pixelwidth ; /* rvv = rv */
}
/*
diff -r -u dvipsk.orig/texps.lpro dvipsk/texps.lpro
--- dvipsk.orig/texps.lpro Sat Sep 21 04:35:30 2002
+++ dvipsk/texps.lpro Sat Sep 21 04:52:57 2002
@@ -51,6 +51,9 @@
% The top of stack is now `n [ AT 0 S at*aspect 0 0]';
% we use this matrix to scale the font later. We store it in Metrics,
% which we'll give a different definition to anyway later.
+ FontType 0 ne {
/Metrics exch def
% Now we start the dictionary of length n that will eventually be Metrics:
dict begin
@@ -71,6 +74,11 @@
% Now we put the widths dictionary into the font, after grabbing
% the current definition of Metrics back.
Metrics /Metrics currentdict end def
+ } {
+ { 1 index type /nametype eq { exit } if exch pop } loop
+ } ifelse
% and duplicate /foo so that it can be used both in definefont
% and as the name of the macro, which is created first as a
% non-executable array so that we can put the new font dictionary
diff -r -u dvipsk.orig/tfmload.c dvipsk/tfmload.c
--- dvipsk.orig/tfmload.c Sat Sep 21 04:35:30 2002
+++ dvipsk/tfmload.c Sat Sep 21 04:52:57 2002
@@ -99,13 +99,26 @@
int
tfmload P1C(register fontdesctype *, curfnt)
{
+#ifdef Omega
+ register integer i, j ;
+#else
register shalfword i ;
+#endif
register integer li ;
integer scaledsize ;
shalfword nw, hd ;
+#ifdef Omega
+ integer bc, ec ;
+ integer nco, ncw, npc, no_repeats ;
+ integer scaled[65536] ;
+ integer chardat[65536] ;
+ integer font_level ;
+ integer pretend_no_chars ;
+#else
shalfword bc, ec ;
integer scaled[256] ;
halfword chardat[256] ;
+#endif
int charcount = 0 ;
tfmopen(curfnt) ;
@@ -113,10 +126,33 @@
* Next, we read the font data from the tfm file, and store it in
* our own arrays.
*/
+#ifdef Omega
+ li = tfm16() ;
+ if (li!=0) {
+ font_level = -1 ;
+ hd = tfm16() ;
+ bc = tfm16() ; ec = tfm16() ;
+ nw = tfm16() ;
+ li = tfm32() ; li = tfm32() ; li = tfm32() ; li = tfm16() ;
+ } else { /* In an .ofm file */
+ font_level = tfm16();
+ li = tfm32() ; hd = tfm32() ;
+ bc = tfm32() ; ec = tfm32() ;
+ nw = tfm32() ;
+ for (i=0; i<8; i++) li=tfm32();
+ if (font_level==1) {
+ nco = tfm32() ;
+ ncw = tfm32() ;
+ npc = tfm32() ;
+ for (i=0; i<12; i++) li=tfm32();
+ }
+ }
+#else
li = tfm16() ; hd = tfm16() ;
bc = tfm16() ; ec = tfm16() ;
nw = tfm16() ;
li = tfm32() ; li = tfm32() ; li = tfm32() ; li = tfm16() ;
+#endif
li = tfm32() ;
check_checksum (li, curfnt->checksum, curfnt->name);
li = (integer)(alpha * (real)tfm32()) ;
@@ -125,23 +161,68 @@
(void)sprintf(errbuf,"Design size mismatch in %s", name) ;
error(errbuf) ;
}
+#ifdef Omega
+ pretend_no_chars=ec+1 ;
+ if (pretend_no_chars<256) pretend_no_chars=256 ;
+ curfnt->chardesc = (chardesctype *)
+ realloc(curfnt->chardesc, sizeof(chardesctype)*pretend_no_chars) ;
+ for (i=2; i<((font_level==1)?nco-29:hd); i++)
+ li = tfm32() ;
+ for (i=0; i<pretend_no_chars; i++)
+ chardat[i] = -1 ;
+ no_repeats = 0 ;
+#else
for (i=2; i<hd; i++)
li = tfm32() ;
for (i=0; i<256; i++)
chardat[i] = 256 ;
+#endif
for (i=bc; i<=ec; i++) {
+#ifdef Omega
+ if (no_repeats>0) {
+ chardat[i] = chardat[i-1] ;
+ no_repeats-- ;
+ } else if (font_level>=0) {
+ chardat[i] = tfm16() ;
+ li = tfm32() ;
+ li |= tfm16() ;
+ if (font_level==1) {
+ no_repeats = tfm16() ;
+ for (j=0; j<(npc|1); j++) tfm16() ;
+ ncw -= 3 + npc/2 ;
+ }
+ } else {
+ chardat[i] = tfmbyte() ;
+ li = tfm16() ;
+ li |= tfmbyte() ;
+ }
+ if (li || chardat[i])
+ charcount++ ;
+#else
chardat[i] = tfmbyte() ;
li = tfm16() ;
li |= tfmbyte() ;
if (li || chardat[i])
charcount++ ;
+#endif
+ }
+#ifdef Omega
+ if (font_level==1&&ncw!=0) {
+ sprintf(errbuf, "Table size mismatch in %s", curfnt->name) ;
+ error(errbuf) ;
}
+#endif
scaledsize = curfnt->scaledsize ;
for (i=0; i<nw; i++)
scaled[i] = scalewidth(tfm32(), scaledsize) ;
(void)fclose(tfmfile) ;
+#ifdef Omega
+ for (i=0; i<pretend_no_chars; i++)
+ if (chardat[i]!= -1) {
+#else
for (i=0; i<256; i++)
if (chardat[i]!= 256) {
+#endif
li = scaled[chardat[i]] ;
curfnt->chardesc[i].TFMwidth = li ;
if (li >= 0)
@@ -151,6 +232,9 @@
curfnt->chardesc[i].flags = (curfnt->resfont ? EXISTS : 0) ;
curfnt->chardesc[i].flags2 = EXISTS ;
}
+#ifdef Omega
+ if (ec>=256) curfnt->codewidth = 2 ; /* XXX: 2byte-code can have ec<256 */
+#endif
curfnt->loaded = 1 ;
return charcount ;
}