summaryrefslogtreecommitdiff
path: root/Build/source/texk/ps2pk/pkout.c
diff options
context:
space:
mode:
authorDenis Bitouzé <dbitouze@wanadoo.fr>2021-02-25 18:23:07 +0000
committerDenis Bitouzé <dbitouze@wanadoo.fr>2021-02-25 18:23:07 +0000
commitc6101f91d071883b48b1b4b51e5eba0f36d9a78d (patch)
tree1bf7f5a881d7a4f5c5bf59d0b2821943dd822372 /Build/source/texk/ps2pk/pkout.c
parent07ee7222e389b0777456b427a55c22d0e6ffd267 (diff)
French translation for tlmgr updated
git-svn-id: svn://tug.org/texlive/trunk@57912 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/ps2pk/pkout.c')
-rw-r--r--Build/source/texk/ps2pk/pkout.c578
1 files changed, 0 insertions, 578 deletions
diff --git a/Build/source/texk/ps2pk/pkout.c b/Build/source/texk/ps2pk/pkout.c
deleted file mode 100644
index 4d50fbe7bee..00000000000
--- a/Build/source/texk/ps2pk/pkout.c
+++ /dev/null
@@ -1,578 +0,0 @@
-/* FILE: pkout.c
- * PURPOSE: implementation of PK output functions
- * COMMENT: functions are derived from `The GFtoPK processor' but
- * presented in a modular fashion so they can be used in other
- * programs.
- * (Porting `top-down' WEB code into modular readable C-code is
- * not a trivial exercise.)
- *
- * AUTHOR: Piet Tutelaers
- * (see README for license)
- */
-
-/* Some constants */
-#define PK_ID 89
-#define PK_SPC1 240 /* All we need, max length always < 255 */
-#define PK_NUMSPC 244
-#define PK_NOOP 246
-#define PK_PRE 247
-#define PK_POST 245
-
-#define DPI 72.27
-#define MIN(a,b) ( (a<b)? (a): (b))
-
-#include "basics.h" /* definitions and fatal() */
-#include <stdio.h>
-#include <stdarg.h> /* va_start(), va_end() */
-#include <stdlib.h> /* malloc() */
-#include "pkout.h"
-
-#undef DEBUG
-static int pk_len = 0;
-static FILE *pkfile;
-
-void pk_open(char *pkname)
-{
- pkfile = fopen(pkname, WB);
- if (pkfile == NULL) fatal("Can not open %s\n", pkname);
-}
-
-void pk_close(void)
-{
- fclose(pkfile);
-}
-
-/* Portable Big Endian output functions */
-
-/* Nybble buffer */
-static int pk_output_byte, bitweight;
-static void pk1(int);
-
-static void pk_nybble(int x)
-{
- if (bitweight == 16) {
- bitweight = 1; pk_output_byte = x*16;
- }
- else {
- bitweight = 16; pk1(pk_output_byte + x);
- }
-}
-
-static void pk1(int x)
-{
- if (x < 0) x += 256;
- putc(x & 0x00ff, pkfile);
- pk_len++;
-}
-
-static void pk2(int x)
-{
- if (x < 0) x += 65536;
- pk1((x & 0x00ff00) >> 8);
- pk1(x & 0x0000ff);
-}
-
-static void pk3(int32_t x)
-{
- pk1((x & 0x00ff0000) >> 16);
- pk1((x & 0x0000ff00) >> 8);
- pk1(x & 0x000000ff);
-}
-
-static void pk4(int32_t x)
-{
- if (x < 0) { /* next two lines from mackay@cs.washington.edu */
- x += 2<<29; x += 2<<29;
- pk1(((x & 0x7f000000) >> 24) + 128);
- }
- else pk1((x & 0x7f000000) >> 24);
- pk1((x & 0x00ff0000) >> 16);
- pk1((x & 0x0000ff00) >> 8);
- pk1(x & 0x000000ff);
-}
-
-static int MAX_COUNTS; /* length of array to hold runlengths */
-
-void pk_preamble(char *comment, /* source of the font */
- float pointsize, /* pointsize in points */
- int32_t checksum, /* should equal to tfm-value */
- unsigned int h_res, /* horizontal resolution (dpi) */
- unsigned int v_res) /* vertical resolution (dpi) */
-{
- int i, len;
-
- /* compute MAX_COUNTS based upon pointsize, h_res and v_res */
- MAX_COUNTS = pointsize / DPI * h_res * (pointsize / DPI * v_res + 1);
-
- pk1(PK_PRE);
- pk1(PK_ID);
- len = strlen(comment);
- len = len>255? 255: len;
- pk1(len);
- for (i=0; i<len; i++) pk1(*comment++);
-
- pk4((int32_t)(pointsize * (1<<20) + 0.5));
- pk4(checksum);
- pk4((int32_t)(h_res / DPI * (1<<16))); pk4((int32_t)(v_res / DPI * (1<<16)));
-}
-
-/* From `The GFtoPK processor', pp. 231 */
-
-static int optimal_size(int W, int H, int cnt, int count[], int *dyn_f)
-{ int comp_size = 0, b_comp_size, deriv[14], i, j, k;
-
- i = (count[0] == 0? 1: 0); /* skip first empty runlength */
- /* compute comp_size and deriv[1..13] */
- for (j=1; j<14; j++) deriv[j] = 0;
- while (i<cnt) {
- j = count[i++];
- if (j == -1) { comp_size++; continue; }
- if (j < 0) { j = -j; comp_size++; }
- if (j < 209) comp_size += 2;
- else {
- k = j - 193;
- while (k >= 16) { k=k/16; comp_size += 2; }
- comp_size++;
- }
- if (j < 14) deriv[j]--;
- else {
- if (j < 209) deriv[(223 - j) / 15]++;
- else {
- k = 16;
- while (k*16 < j+3) k *= 16;
- if (j-k <= 192) deriv[(207-j+k)/15] += 2;
- }
- }
- }
- /* find minimal value */
- b_comp_size = comp_size; *dyn_f = 0;
- for (i=1; i<14; i++) {
- comp_size += deriv[i];
- if (comp_size <= b_comp_size) {
- b_comp_size = comp_size; *dyn_f = i;
- }
- }
- comp_size = (b_comp_size + 1) / 2;
- if (H*W == 0 || (comp_size > (H*W + 7) / 8)) {
- comp_size = (H*W + 7) / 8; *dyn_f = 14;
- }
- return comp_size;
-}
-
-/* Next array contains the runlengths */
-static int *count = NULL;
-
-/* Global variables (interface between pk_runlengths() and pk_char() */
-static int dyn_f, comp_size, cnt;
-
-static void pk_runlengths(int W, int H, int (*next_pixel)())
-{ int current_value, pixel, i, j, max_counts, first_count;
- int total_pixels, rc, row, col, runlength;
- int color2, total_pixels2, /* counting equal rows variables */
- i1, i2, newrow;
-
- first_count = H; max_counts = first_count + H * W;
- if (count == NULL) {
- count = malloc(MAX_COUNTS * sizeof(int));
- if (count == NULL) fatal("Out of memory\n");
- }
-
- if (max_counts > MAX_COUNTS) {
- free(count);
- count = malloc(max_counts * sizeof(int));
- if (count == NULL) fatal("Out of memory\n");
- MAX_COUNTS = max_counts;
- }
-
- /* 1: compute transitions BLACK<->WHITE */
-
- cnt = first_count;
- runlength = 0; current_value = BLACK;
- for (row=0; row < H; row++) {
- for (col=0; col<W; col++) {
- pixel = (*next_pixel)();
- if (pixel == current_value) runlength++;
- else if (pixel == OTHER(current_value)) {
- count[cnt++] = runlength;
- current_value = OTHER(current_value);
- runlength = 1;
- }
- }
- }
- if (runlength>0)
- count[cnt++] = runlength;
-
- /* for an empty glyph */
- if (cnt == first_count) count[cnt++] = 0;
-
-#ifdef DEBUG
- current_value = BLACK;
- for (i=first_count; i<cnt; i++)
- if (count[i] < 0) printf("[%d]", -count[i]);
- else {
- if (current_value == BLACK) printf("%d", count[i]);
- else printf("(%d)", count[i]);
- current_value = OTHER(current_value);
- }
- putchar('\n');
-#endif
-
- /* 2: Now remove equal lines and add a repeat count at the first
- transition of a row */
-
- i = first_count; j = 0;
- total_pixels = 0; row = -1;
- current_value = BLACK;
- if (count[i] == 0) {
- count[j++] = count[i++];
- current_value = WHITE;
- }
- while (i < cnt) {
- if (j >= i) fatal("Program error: report to author!\n");
- count[j++] = count[i];
- total_pixels += count[i++];
- current_value = OTHER(current_value);
- newrow = total_pixels / W; col = total_pixels % W;
- /* if transition starts in column zero or in a previous row
- then continue */
- if (newrow == row || row == H-1 || col == 0) continue;
- row = newrow;
-
- /* count equal rows */
-
- /* 1: goto first transition of next row */
- color2 = current_value;
- total_pixels2 = total_pixels; i2 = i;
- while (i2 < cnt && total_pixels2 / W == row) {
- total_pixels2 += count[i2++];
- color2 = OTHER(color2);
- }
-
- /* 2: do we need to compute a repeat count? */
- if (color2 != current_value
- || total_pixels2 - total_pixels != W) continue;
-
- /* 3: count them */
- rc = 0; i1 = i;
- while (i2 < cnt && count[i1] == count[i2]) {
-#ifdef DEBUG
- printf("%d (%d)", count[i1], count[i2]);
-#endif
- total_pixels2 += count[i2++]; i1++;
- }
- rc = total_pixels2 / W - row; /* enclosed rows */
- if (MIN(count[i1], count[i2]) + total_pixels2 % W < W)
- rc--;
-#ifdef DEBUG
- printf(" row %d: rc = %d\n", row, rc);
-#endif
-
- /* 3: now remove the equal rows and finish last row */
- if (rc > 0) {
- /* insert a repeat count */
- if (j >= i) fatal("Program error: report to author\n");
- count[j++] = -rc;
-
- /* finish runlengths of current row */
- while (total_pixels + count[i] < row*W+W) {
- if (j >= i) fatal("Program error: increase FIRST_COUNT!\n");
- count[j++] = count[i];
- total_pixels += count[i++];
- current_value = OTHER(current_value);
- }
-
- /* skip runlengths of equal rows */
- while (total_pixels + count[i] < (row+rc+1)*W) {
- total_pixels += count[i++];
- current_value = OTHER(current_value);
- }
- row += rc;
- }
- }
- cnt = j; /* that is what we have now */
-
- /* 3: compute optimal packing size */
-
- comp_size = optimal_size(H, W, cnt, count, &dyn_f);
-#ifdef DEBUG
- current_value = BLACK;
- for (i=0; i<cnt; i++)
- if (count[i] < 0) printf("[%d]", -count[i]);
- else {
- if (current_value == BLACK) printf("%d", count[i]);
- else printf("(%d)", count[i]);
- current_value = OTHER(current_value);
- }
- printf("\nOptimal packing with dyn_f = %d total size %d\n",
- dyn_f, comp_size);
-#endif
-}
-
-#define MAX_TWOBYTE_NYBBLE (208 - 15*dyn_f)
-
-static void pk_number(int x)
-{ int k;
-
- if (x < 0) { /* repeat count */
- if (x == -1) pk_nybble(0xF);
- else { pk_nybble(0xE);
- pk_number(-x);
- }
- }
- else if (x <= dyn_f) pk_nybble(x);
- else if (x <= MAX_TWOBYTE_NYBBLE) { /* two nybble values */
- x-= dyn_f+1;
- pk_nybble(dyn_f + 1 + x / 16);
- pk_nybble(x % 16);
- }
- else { /* huge counts */
- x = x - MAX_TWOBYTE_NYBBLE + 15; k = 16;
- while (k <= x) { k *= 16; pk_nybble(0x0); }
- while (k > 1) { k = k / 16; pk_nybble(x / k); x = x % k; }
- }
-}
-
-/* in case runlength encoding is not optimal we send a compressed
- bitmap in stead of the packed runlengths
- See GFtoPK processor, pp. 235 */
-static void pk_bitmap(int width, int cnt, int runlength[])
-{ int count, /* number of bits in the current state to send */
- buff, /* byte buffer */
- h_bit, /* horizontal bit count for each runlength */
- p_bit, /* what bit are we about to send out? */
- r_on, s_on, /* state saving variables */
- r_count, s_count,/* dito */
- r_i, s_i, /* dito */
- rc, /* repeat count */
- state, /* state variable (what state?) */
- on, /* starting with black? */
- i; /* points to next runlength */
- static int power[9] = {1, 2, 4, 8, 16, 32, 64, 128, 256};
-
- buff = 0; p_bit = 8; h_bit = width;
- state = 0; rc = 0;
- r_on = s_on = r_count = s_count = r_i = s_i = 0; /* avoid warnings */
- on = 1; count = runlength[0]; i = 1;
- while (i < cnt || state || count>0) {
- if (state) {
- count = r_count; i = r_i; on = r_on; rc--;
- }
- else {
- r_count = count; r_i = i; r_on = on;
- }
-
- /* send one row of width bits */
- do {
- if (count == 0) {
- if (runlength[i] < 0) {
- if (!state) rc = - runlength[i];
- i++;
- }
- count = runlength[i]; i++; on = !on;
- }
- if (count >= p_bit && p_bit < h_bit) {
- /* we end a byte, we don't end a runlength */
- if (on) buff += power[p_bit] - 1;
- pk1(buff);
- buff = 0; h_bit -= p_bit;
- count -= p_bit; p_bit = 8;
- }
- else {
- if (count < p_bit && count < h_bit) {
- /* we neither end the row nor the byte */
- if (on) buff += power[p_bit] - power[p_bit-count];
- p_bit -= count; h_bit -= count; count = 0;
- }
- else { /* we end a row and maybe a byte */
- if (on) buff += power[p_bit] - power[p_bit-h_bit];
- count -= h_bit; p_bit -= h_bit; h_bit = width;
- if (p_bit == 0) {
- pk1(buff); buff = 0; p_bit = 8;
- }
- }
- }
- } while (h_bit != width);
-
- if (state && rc == 0) {
- count = s_count; i = s_i; on = s_on; state = 0;
- }
- else if (!state && rc >0) {
- s_count = count; s_i = i; s_on = on; state = 1;
- }
- }
- if (p_bit != 8) pk1(buff);
-}
-
-/* For packing a character */
-void pk_char(int char_code, /* character code 0..255 */
- int32_t tfm_width, /* TFM width of character */
- int h_escapement, /* horizontal escapement in pixels */
- unsigned int width, /* width of bounding box */
- unsigned int height, /* height of bounding box */
- int h_offset, /* horizontal offset to reference point */
- int v_offset, /* vertical offset to reference point */
- int (*next_pixel)()) /* user's next pixel generator */
-{ int i;
- unsigned short flag_byte;
-
- pk_runlengths(width, height, next_pixel);
-
- /* write a character preamble */
-
- flag_byte = dyn_f * 16;
- if (count[0] > 0) flag_byte += 8; /* starting in BLACK */
- if (tfm_width > 0XFFFFFF || width > 65535 || height > 65535
- || h_offset > 32767 || v_offset > 32767
- || h_offset < -32768 || v_offset < -32768
- || comp_size > 196594)
- { /* write long format */
- fatal("Can't handle long format yet!\n");
- }
- else if (h_escapement > 255 || width > 255 || height > 255
- || h_offset > 127 || v_offset > 127
- || h_offset < -128 || v_offset < -128
- || comp_size > 1015)
- { /* write two-byte short character preamble */
- comp_size += 13; flag_byte += comp_size / 65535 + 4;
- pk1(flag_byte);
- pk2(comp_size % 65535);
- pk1(char_code);
- pk3(tfm_width);
- pk2(h_escapement); /* pixels ! */
- pk2(width);
- pk2(height);
- pk2(h_offset);
- pk2(v_offset);
- }
- else { /* write one-byte short character preamble */
- comp_size += 8; flag_byte += comp_size / 256;
- pk1(flag_byte);
- pk1(comp_size % 256);
- pk1(char_code);
- pk3(tfm_width);
- pk1(h_escapement); /* pixels ! */
- pk1(width);
- pk1(height);
- pk1(h_offset);
- pk1(v_offset);
- }
-
- /* and now the character itself */
- if (dyn_f != 14) { /* send compressed format */
- if (count[0] == 0) i = 1; else i = 0;
- bitweight = 16;
- for (i=i; i<cnt; i++) pk_number(count[i]);
- if (bitweight != 16) pk1(pk_output_byte);
- }
- else /* send bitmap */
- if (height > 0) pk_bitmap(width, cnt, count);
-
-}
-
-/*
- * Output small string special (<255 chars)
- */
-static void pkstring(const char *fmt, ...) {
- char buf[256]; int i, len;
- va_list args;
-
- va_start(args, fmt);
-#ifdef CHARSPRINTF
- (void) vsprintf(buf, fmt, args);
- len = strlen(buf);
-#else
- len = vsprintf(buf, fmt, args);
-#endif
- if (len > 255 || len < 0) fatal("PK string exceeds 255 characters\n");
- va_end(args);
-
- pk1(PK_SPC1);
- pk1(len); i = 0;
- for (i = 0; i < len; i++) pk1(buf[i]);
-}
-
-/*
- * Compute METAFONT magnification string for <dpi>
- */
-
-static int PSPKINT(float x) {
- return (int) x;
-}
-
-static char mag_str[64];
-
-static char *magnification (int dpi, int BDPI) {
- double size, magstep;
-
- if (dpi == BDPI) {
- sprintf(mag_str, "magstep(0)");
- return mag_str;
- }
- size = BDPI; magstep = 0;
- while (dpi < size) {
- size = size / 1.095445115;
- magstep -= 0.5;
- if (dpi == PSPKINT(size + 0.5)) {
- sprintf(mag_str, "magstep(%.1f)", magstep);
- return mag_str;
- }
- if (dpi > size) {
- sprintf(mag_str, "%d+%d/%d", PSPKINT(dpi/BDPI), dpi%BDPI, BDPI);
- return mag_str;
- }
- }
- while (dpi > size) {
- size = size * 1.095445115;
- magstep += 0.5;
- if (dpi == PSPKINT(size + 0.5)) {
- sprintf(mag_str, "magstep(%.1f)", magstep);
- return mag_str;
- }
- if (dpi < size) {
- sprintf(mag_str, "%d+%d/%d", PSPKINT(dpi/BDPI), dpi%BDPI, BDPI);
- return mag_str;
- }
- }
- fatal("PK could not determine magnification\n");
-}
-
-/*
- * Barebone postample
- */
-void pk_postamble(void)
-{
- pk1(PK_POST);
- while (pk_len % 4 != 0) pk1(PK_NOOP);
-}
-
-/*
- * Write special PK strings in the postamble for identification
- * purposes as proposed by mackay@cs.washington.edu.
- */
-void ps2pk_postamble(char *fontname, /* The real FontName from the afm */
- char *encname, /* The actual name, not the filename */
- int base_res, /* basic resolution */
- int h_res, /* Match against base_res for mag */
- int v_res, /* Match against h_res for aspect_ratio */
- float pointsize, /* Used for fontfacebyte calculation */
- char *args) /* Essential ps2pk args */
-{
- int i;
-
- pkstring("ps2pk options: %s", args);
- pkstring("fontid=%s", fontname);
- if (encname) pkstring("codingscheme=%s", encname);
- pkstring("fontfacebyte");
- pk1(PK_NUMSPC);
- i = (pointsize < 127.0) ?
- ((254 - (int)((2 * pointsize)+0.5)) * (1 << 16)) : 0;
- pk4(i);
- pkstring("pixels_per_inch=%d", base_res);
- pkstring("mag=%s", magnification(h_res, base_res));
- if (v_res != h_res)
- pkstring("aspect ratio=%d / %d",
- (int)((1.0 * v_res / h_res * base_res) + 0.5), base_res);
-
- pk1(PK_POST);
- while (pk_len % 4 != 0) pk1(PK_NOOP);
-}