summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/pdftexdir/writet3.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/pdftexdir/writet3.c')
-rw-r--r--Build/source/texk/web2c/pdftexdir/writet3.c173
1 files changed, 83 insertions, 90 deletions
diff --git a/Build/source/texk/web2c/pdftexdir/writet3.c b/Build/source/texk/web2c/pdftexdir/writet3.c
index fa9c09bc3d1..d50de0bb52f 100644
--- a/Build/source/texk/web2c/pdftexdir/writet3.c
+++ b/Build/source/texk/web2c/pdftexdir/writet3.c
@@ -1,5 +1,5 @@
/*
-Copyright (c) 1996-2002 Han The Thanh, <thanh@pdftex.org>
+Copyright (c) 1996-2006 Han The Thanh, <thanh@pdftex.org>
This file is part of pdfTeX.
@@ -17,27 +17,24 @@ You should have received a copy of the GNU General Public License
along with pdfTeX; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-$Id: //depot/Build/source.development/TeX/texk/web2c/pdftexdir/writet3.c#9 $
+$Id: writet3.c,v 1.10 2005/12/26 14:26:18 hahe Exp hahe $
*/
#include "ptexlib.h"
#include <kpathsea/tex-glyph.h>
#include <kpathsea/magstep.h>
+#include <string.h>
#define T3_BUF_SIZE 1024
-static const char perforce_id[] =
- "$Id: //depot/Build/source.development/TeX/texk/web2c/pdftexdir/writet3.c#9 $";
-
-/* define t3_line_ptr, t3_line_array & t3_line_limit */
typedef char t3_line_entry;
-define_array(t3_line);
+define_array(t3_line);
FILE *t3_file;
static boolean t3_image_used;
-static integer t3_char_procs[MAX_CHAR_CODE + 1];
-static float t3_char_widths[MAX_CHAR_CODE + 1];
+static integer t3_char_procs[256];
+static float t3_char_widths[256];
static int t3_glyph_num;
static float t3_font_scale;
static integer t3_b0, t3_b1, t3_b2, t3_b3;
@@ -48,17 +45,17 @@ static boolean is_pk_font;
#define t3_close() xfclose(t3_file, cur_file_name)
#define t3_getchar() xgetc(t3_file)
#define t3_eof() feof(t3_file)
-#define t3_prefix(s) (!strncmp(t3_line_array, s, strlen(s)))
+#define t3_prefix(s) str_prefix(t3_line_array, s)
#define t3_putchar(c) pdfout(c)
#define t3_check_eof() \
if (t3_eof()) \
pdftex_fail("unexpected end of file");
-static void t3_getline(void)
+static void t3_getline(void)
{
int c;
-restart:
+ restart:
t3_line_ptr = t3_line_array;
c = t3_getchar();
while (!t3_eof()) {
@@ -83,15 +80,15 @@ static void t3_putline(void)
t3_putchar(*p++);
}
-static void update_bbox(integer llx, integer lly, integer urx, integer ury, boolean is_first_glyph)
+static void update_bbox(integer llx, integer lly, integer urx, integer ury,
+ boolean is_first_glyph)
{
if (is_first_glyph) {
t3_b0 = llx;
t3_b1 = lly;
t3_b2 = urx;
t3_b3 = ury;
- }
- else {
+ } else {
if (llx < t3_b0)
t3_b0 = llx;
if (lly < t3_b1)
@@ -121,8 +118,7 @@ static void t3_write_glyph(internalfontnumber f)
}
if (glyph_index < fontbc[f] || glyph_index > fontec[f])
return;
- }
- else
+ } else
return;
if (!pdfcharmarked(f, glyph_index)) {
while (!t3_prefix(t3_end_glyph_str)) {
@@ -133,18 +129,18 @@ static void t3_write_glyph(internalfontnumber f)
}
update_bbox(llx, lly, urx, ury, t3_glyph_num == 0);
t3_glyph_num++;
- pdfnewdict(0, 0);
+ pdfnewdict(0, 0, 0);
t3_char_procs[glyph_index] = objptr;
- if (width == 0)
- t3_char_widths[glyph_index] =
- (getcharwidth(f, glyph_index)/t3_font_scale) / pdffontsize[f];
+ if (width == 0)
+ t3_char_widths[glyph_index] =
+ (getcharwidth(f, glyph_index) / t3_font_scale) / pdffontsize[f];
else
t3_char_widths[glyph_index] = width;
pdfbeginstream();
t3_getline();
- pdf_printf("%i 0 %i %i %i %i d1\nq\n",
- (int)t3_char_widths[glyph_index], (int)llx,
- (int)lly, (int)urx, (int)ury);
+ pdf_printf("%i 0 %i %i %i %i d1\nq\n",
+ (int) t3_char_widths[glyph_index], (int) llx,
+ (int) lly, (int) urx, (int) ury);
while (!t3_prefix(t3_end_glyph_str)) {
t3_check_eof();
if (t3_prefix("BI"))
@@ -158,24 +154,23 @@ static void t3_write_glyph(internalfontnumber f)
static integer get_pk_font_scale(internalfontnumber f)
{
- return
- dividescaled(pkscalefactor,
- dividescaled(pdffontsize[f], onehundredbp, fixeddecimaldigits + 2),
- 0);
+ return
+ dividescaled(pkscalefactor,
+ dividescaled(pdffontsize[f], onehundredbp,
+ fixeddecimaldigits + 2), 0);
}
static integer pk_char_width(internalfontnumber f, scaled w)
{
- return
+ return
dividescaled(dividescaled(w, pdffontsize[f], 7),
get_pk_font_scale(f), 0);
}
scaled getpkcharwidth(internalfontnumber f, scaled w)
{
- return (get_pk_font_scale(f)/100000.0)*
- (pk_char_width(f, w)/100.0)*
- pdffontsize[f];
+ return (get_pk_font_scale(f) / 100000.0) *
+ (pk_char_width(f, w) / 100.0) * pdffontsize[f];
}
static boolean writepk(internalfontnumber f)
@@ -188,23 +183,24 @@ static boolean writepk(internalfontnumber f)
chardesc cd;
boolean is_null_glyph, check_preamble;
integer dpi;
- int e;
- dpi = kpse_magstep_fix(
- round(fixedpkresolution*(((float)pdffontsize[f])/fontdsize[f])),
- fixedpkresolution, NULL);
+ dpi =
+ kpse_magstep_fix(round
+ (fixedpkresolution *
+ (((float) pdffontsize[f]) / fontdsize[f])),
+ fixedpkresolution, NULL);
cur_file_name = makecstring(fontname[f]);
- name = kpse_find_pk(cur_file_name, (unsigned)dpi, &font_ret);
+ name = kpse_find_pk(cur_file_name, (unsigned) dpi, &font_ret);
if (name == NULL ||
!FILESTRCASEEQ(cur_file_name, font_ret.name) ||
- !kpse_bitmap_tolerance((float)font_ret.dpi, (float)dpi)) {
- pdftex_warn("Font %s at %i not found", cur_file_name, (int)dpi);
+ !kpse_bitmap_tolerance((float) font_ret.dpi, (float) dpi)) {
+ pdftex_warn("Font %s at %i not found", cur_file_name, (int) dpi);
cur_file_name = NULL;
return false;
}
t3_file = xfopen(name, FOPEN_RBIN_MODE);
t3_image_used = true;
is_pk_font = true;
- tex_printf(" <%s", (char *)name);
+ tex_printf(" <%s", (char *) name);
cd.rastersize = 256;
cd.raster = xtalloc(cd.rastersize, halfword);
check_preamble = true;
@@ -212,16 +208,15 @@ static boolean writepk(internalfontnumber f)
check_preamble = false;
if (!pdfcharmarked(f, cd.charcode))
continue;
- t3_char_widths[cd.charcode] =
+ t3_char_widths[cd.charcode] =
pk_char_width(f, getcharwidth(f, cd.charcode));
if (cd.cwidth < 1 || cd.cheight < 1) {
- cd.xescape = cd.cwidth = round(t3_char_widths[cd.charcode]/100.0);
+ cd.xescape = cd.cwidth = round(t3_char_widths[cd.charcode] / 100.0);
cd.cheight = 1;
cd.xoff = 0;
cd.yoff = 0;
is_null_glyph = true;
- }
- else
+ } else
is_null_glyph = false;
llx = -cd.xoff;
lly = cd.yoff - cd.cheight + 1;
@@ -229,35 +224,34 @@ static boolean writepk(internalfontnumber f)
ury = cd.cheight + lly;
update_bbox(llx, lly, urx, ury, t3_glyph_num == 0);
t3_glyph_num++;
- pdfnewdict(0, 0);
+ pdfnewdict(0, 0, 0);
t3_char_procs[cd.charcode] = objptr;
pdfbeginstream();
pdfprintreal(t3_char_widths[cd.charcode], 2);
- pdf_printf(" 0 %i %i %i %i d1\n",
- (int)llx, (int)lly, (int)urx, (int)ury);
+ pdf_printf(" 0 %i %i %i %i d1\n",
+ (int) llx, (int) lly, (int) urx, (int) ury);
if (is_null_glyph)
goto end_stream;
- pdf_printf("q\n%i 0 0 %i %i %i cm\nBI\n", (int)cd.cwidth,
- (int)cd.cheight, (int)llx, (int)lly);
- pdf_printf("/W %i\n/H %i\n",
- (int)cd.cwidth, (int)cd.cheight);
+ pdf_printf("q\n%i 0 0 %i %i %i cm\nBI\n", (int) cd.cwidth,
+ (int) cd.cheight, (int) llx, (int) lly);
+ pdf_printf("/W %i\n/H %i\n", (int) cd.cwidth, (int) cd.cheight);
pdf_puts("/IM true\n/BPC 1\n/D [1 0]\nID ");
- cw = (cd.cwidth + 7)/8;
- rw = (cd.cwidth + 15)/16;
+ cw = (cd.cwidth + 7) / 8;
+ rw = (cd.cwidth + 15) / 16;
row = cd.raster;
for (i = 0; i < cd.cheight; i++) {
for (j = 0; j < rw - 1; j++) {
- pdfout(*row/256);
- pdfout(*row%256);
+ pdfout(*row / 256);
+ pdfout(*row % 256);
row++;
}
- pdfout(*row/256);
- if (2*rw == cw)
- pdfout(*row%256);
+ pdfout(*row / 256);
+ if (2 * rw == cw)
+ pdfout(*row % 256);
row++;
}
pdf_puts("\nEI\nQ\n");
-end_stream:
+ end_stream:
pdfendstream();
}
xfree(cd.raster);
@@ -268,13 +262,14 @@ end_stream:
void writet3(int objnum, internalfontnumber f)
{
static char t3_font_scale_str[] = "\\pdffontscale";
- int i, e;
+ int i;
+ integer wptr, eptr, cptr;
int first_char, last_char;
integer pk_font_scale;
boolean is_notdef;
t3_glyph_num = 0;
t3_image_used = false;
- for (i = 0; i <= MAX_CHAR_CODE; i++) {
+ for (i = 0; i < 256; i++) {
t3_char_procs[i] = 0;
t3_char_widths[i] = 0;
}
@@ -292,8 +287,9 @@ void writet3(int objnum, internalfontnumber f)
tex_printf("<%s", nameoffile + 1);
t3_getline();
if (!t3_prefix(t3_font_scale_str) ||
- sscanf(t3_line_array + strlen(t3_font_scale_str) + 1, "%g", &t3_font_scale) < 1 ||
- t3_font_scale <= 0 || t3_font_scale > 1000 ) {
+ sscanf(t3_line_array + strlen(t3_font_scale_str) + 1, "%g",
+ &t3_font_scale) < 1 || t3_font_scale <= 0
+ || t3_font_scale > 1000) {
pdftex_warn("missing or invalid font scale");
t3_close();
cur_file_name = NULL;
@@ -301,7 +297,7 @@ void writet3(int objnum, internalfontnumber f)
}
while (!t3_eof())
t3_write_glyph(f);
-write_font_dict:
+ write_font_dict:
for (i = fontbc[f]; i <= fontec[f]; i++)
if (pdfcharmarked(f, i))
break;
@@ -310,9 +306,9 @@ write_font_dict:
if (pdfcharmarked(f, i))
break;
last_char = i;
- pdfbegindict(objnum); /* Type 3 font dictionary */
+ pdfbegindict(objnum, 1); /* Type 3 font dictionary */
pdf_puts("/Type /Font\n/Subtype /Type3\n");
- pdf_printf("/Name /F%i\n", (int)f);
+ pdf_printf("/Name /F%i\n", (int) f);
if (pdffontattr[f] != getnullstr()) {
pdfprint(pdffontattr[f]);
pdf_puts("\n");
@@ -323,41 +319,39 @@ write_font_dict:
pdfprintreal(pk_font_scale, 5);
pdf_puts(" 0 0 ");
pdfprintreal(pk_font_scale, 5);
- pdf_puts(" 0 0]\n") ;
- }
- else
- pdf_printf("/FontMatrix [%g 0 0 %g 0 0]\n",
- (double)t3_font_scale, (double)t3_font_scale);
- pdf_printf("/%s [ %i %i %i %i ]\n",
- font_keys[FONTBBOX1_CODE].pdfname,
- (int)t3_b0, (int)t3_b1,
- (int)t3_b2, (int)t3_b3);
- pdf_printf("/Resources << /ProcSet [ /PDF %s] >>\n",
+ pdf_puts(" 0 0]\n");
+ } else
+ pdf_printf("/FontMatrix [%g 0 0 %g 0 0]\n",
+ (double) t3_font_scale, (double) t3_font_scale);
+ pdf_printf("/%s [ %i %i %i %i ]\n",
+ font_key[FONTBBOX1_CODE].pdfname,
+ (int) t3_b0, (int) t3_b1, (int) t3_b2, (int) t3_b3);
+ pdf_printf("/Resources << /ProcSet [ /PDF %s] >>\n",
t3_image_used ? "/ImageB " : "");
pdf_printf("/FirstChar %i\n/LastChar %i\n", first_char, last_char);
- pdf_printf("/Widths %i 0 R\n/Encoding %i 0 R\n/CharProcs %i 0 R\n",
- (int)(objptr + 1), (int)(objptr + 2),
- (int)(objptr + 3));
+ wptr = pdfnewobjnum();
+ eptr = pdfnewobjnum();
+ cptr = pdfnewobjnum();
+ pdf_printf("/Widths %i 0 R\n/Encoding %i 0 R\n/CharProcs %i 0 R\n",
+ (int) wptr, (int) eptr, (int) cptr);
pdfenddict();
- pdfnewobj(0, 0); /* chars width array */
+ pdfbeginobj(wptr, 1); /* chars width array */
pdf_puts("[");
if (is_pk_font)
for (i = first_char; i <= last_char; i++) {
pdfprintreal(t3_char_widths[i], 2);
pdf_puts(" ");
- }
- else
+ } else
for (i = first_char; i <= last_char; i++)
- pdf_printf("%i ", (int)t3_char_widths[i]);
+ pdf_printf("%i ", (int) t3_char_widths[i]);
pdf_puts("]\n");
pdfendobj();
- pdfnewdict(0, 0); /* encoding dictionary */
+ pdfbegindict(eptr, 1); /* encoding dictionary */
pdf_printf("/Type /Encoding\n/Differences [%i", first_char);
if (t3_char_procs[first_char] == 0) {
pdf_printf("/%s", notdef);
is_notdef = true;
- }
- else {
+ } else {
pdf_printf("/a%i", first_char);
is_notdef = false;
}
@@ -367,8 +361,7 @@ write_font_dict:
pdf_printf(" %i/%s", i, notdef);
is_notdef = true;
}
- }
- else {
+ } else {
if (is_notdef) {
pdf_printf(" %i", i);
is_notdef = false;
@@ -378,10 +371,10 @@ write_font_dict:
}
pdf_puts("]\n");
pdfenddict();
- pdfnewdict(0, 0); /* CharProcs dictionary */
+ pdfbegindict(cptr, 1); /* CharProcs dictionary */
for (i = first_char; i <= last_char; i++)
if (t3_char_procs[i] != 0)
- pdf_printf("/a%i %i 0 R\n", (int)i, (int)t3_char_procs[i]);
+ pdf_printf("/a%i %i 0 R\n", (int) i, (int) t3_char_procs[i]);
pdfenddict();
t3_close();
tex_printf(">");