summaryrefslogtreecommitdiff
path: root/filter/pstext.c
diff options
context:
space:
mode:
authorDidier Raboud <odyx@debian.org>2012-10-25 21:07:57 +0200
committerDidier Raboud <odyx@debian.org>2012-10-25 21:07:57 +0200
commit81ab83f382660bc7980ae954725c4ebf28764b03 (patch)
tree523268f698a63a8fd44f3491d94d140266b2403b /filter/pstext.c
parenta75966e33dbc3e3e096338fd332f515cb313b58a (diff)
downloadcups-upstream/1.6.0.tar.gz
Imported Upstream version 1.6.0upstream/1.6.0
Diffstat (limited to 'filter/pstext.c')
-rw-r--r--filter/pstext.c511
1 files changed, 0 insertions, 511 deletions
diff --git a/filter/pstext.c b/filter/pstext.c
deleted file mode 100644
index 536c3949..00000000
--- a/filter/pstext.c
+++ /dev/null
@@ -1,511 +0,0 @@
-/*
- * "$Id: pstext.c 9533 2011-02-16 21:33:17Z mike $"
- *
- * Common PostScript text code for CUPS.
- *
- * Copyright 2008-2010 by Apple Inc.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * psTextEmbedFonts() - Embed PostScript fonts.
- * psTextListFonts() - List PostScript fonts.
- * psTextInitialize() - Load and embed font data for UTF-8 text.
- * psTextUTF8() - Output UTF-8 text at the current position.
- * psTextUTF32() - Output UTF-32 text at the current position.
- */
-
-/*
- * Include necessary headers...
- */
-
-#include "pstext.h"
-#include <cups/language-private.h>
-
-
-/*
- * Composite font names...
- */
-
-static const char * const ps_font_names[] =
-{
- "cupsNormal",
- "cupsBold",
- "cupsItalic",
- "cupsBoldItalic"
-};
-
-
-/*
- * 'psTextEmbedFonts()'- Embed PostScript fonts.
- */
-
-void
-psTextEmbedFonts(ps_text_t *fonts) /* I - Font data */
-{
- int i, j; /* Looping vars */
- const char *cups_datadir; /* CUPS_DATADIR environment variable */
- char *font; /* Current font */
- char filename[1024]; /* Current filename */
- FILE *fp; /* Current file */
- char line[1024]; /* Line from file */
- int ch; /* Character value */
-
-
- /*
- * Get the data directory...
- */
-
- if ((cups_datadir = getenv("CUPS_DATADIR")) == NULL)
- cups_datadir = CUPS_DATADIR;
-
- /*
- * Embed each font...
- */
-
- for (font = (char *)cupsArrayFirst(fonts->unique);
- font;
- font = (char *)cupsArrayNext(fonts->unique))
- {
- printf("%%%%BeginResource: font %s\n", font);
-
- snprintf(filename, sizeof(filename), "%s/fonts/%s", cups_datadir, font);
- if ((fp = fopen(filename, "rb")) != NULL)
- {
- while ((j = fread(line, 1, sizeof(line), fp)) > 0)
- fwrite(line, 1, j, stdout);
-
- fclose(fp);
- }
- else
- {
- _cupsLangPrintError("ERROR", _("Unable to open print file"));
- fprintf(stderr, "DEBUG: Unable to open \"%s\".\n", filename);
- }
-
- puts("\n%%EndResource");
- }
-
- /*
- * Write the encoding arrays...
- */
-
- puts("% Character encodings");
-
- for (i = 0; i < fonts->num_fonts; i ++)
- {
- printf("/cupsEncoding%02x [\n", i);
-
- for (ch = 0; ch < 256; ch ++)
- {
- if (fonts->glyphs[fonts->codes[i * 256 + ch]])
- printf("/%s", fonts->glyphs[fonts->codes[i * 256 + ch]]);
- else if (fonts->codes[i * 256 + ch] > 255)
- printf("/uni%04X", fonts->codes[i * 256 + ch]);
- else
- printf("/.notdef");
-
- if ((ch & 7) == 7)
- putchar('\n');
- }
-
- puts("] def");
- }
-
- /*
- * Construct composite fonts... Start by reencoding the base fonts...
- */
-
- puts("% Reencode base fonts");
-
- for (i = 0; i < 4; i ++)
- for (j = 0; j < fonts->num_fonts; j ++)
- {
- printf("/%s findfont\n", fonts->fonts[j][i]);
- printf("dup length 1 add dict begin\n"
- " { 1 index /FID ne { def } { pop pop } ifelse } forall\n"
- " /Encoding cupsEncoding%02x def\n"
- " currentdict\n"
- "end\n", j);
- printf("/%s%02x exch definefont /%s%02x exch def\n", ps_font_names[i], j,
- ps_font_names[i], j);
- }
-
- /*
- * Then merge them into composite fonts...
- */
-
- puts("% Create composite fonts");
-
- for (i = 0; i < 4; i ++)
- {
- puts("8 dict begin");
- puts("/FontType 0 def/FontMatrix[1.0 0 0 1.0 0 0]def/FMapType 2 def"
- "/Encoding[");
- for (j = 0; j < fonts->num_fonts; j ++)
- if (j == (fonts->num_fonts - 1))
- printf("%d", j);
- else if ((j & 15) == 15)
- printf("%d\n", j);
- else
- printf("%d ", j);
- puts("]def/FDepVector[");
- for (j = 0; j < fonts->num_fonts; j ++)
- if (j == (fonts->num_fonts - 1))
- printf("%s%02x", ps_font_names[i], j);
- else if ((j & 3) == 3)
- printf("%s%02x\n", ps_font_names[i], j);
- else
- printf("%s%02x ", ps_font_names[i], j);
- puts("]def currentdict end");
- printf("/%s exch definefont pop\n", ps_font_names[i]);
- }
-
- /*
- * Procedures...
- */
-
- puts("% Procedures to justify text...\n"
- "/showcenter{dup stringwidth pop -0.5 mul 0 rmoveto show}bind def\n"
- "/showleft{show}bind def\n"
- "/showright{dup stringwidth pop neg 0 rmoveto show}bind def");
-}
-
-
-/*
- * 'psTextListFonts()' - List PostScript fonts.
- */
-
-void
-psTextListFonts(ps_text_t *fonts) /* I - Font data */
-{
- char *font; /* Current font */
-
-
- font = (char *)cupsArrayFirst(fonts->unique);
- printf("%%%%DocumentSuppliedResources: font %s\n", font);
- while ((font = (char *)cupsArrayNext(fonts->unique)) != NULL)
- printf("%%%%+ font %s\n", font);
-}
-
-
-/*
- * 'psTextInitialize()' - Load and embed font data for UTF-8 text.
- */
-
-ps_text_t * /* O - Font data */
-psTextInitialize(void)
-{
- ps_text_t *fonts; /* Font data */
- int i, j; /* Looping vars */
- char filename[1024]; /* Current filename */
- FILE *fp; /* Current file */
- const char *cups_datadir; /* CUPS_DATADIR environment variable */
- char line[1024], /* Line from file */
- *lineptr, /* Pointer into line */
- *valptr; /* Pointer to value in line */
- int unicode; /* Character value */
- int start, end; /* Start and end values for range */
- char glyph[64]; /* Glyph name */
-
-
- /*
- * Get the data directory...
- */
-
- if ((cups_datadir = getenv("CUPS_DATADIR")) == NULL)
- cups_datadir = CUPS_DATADIR;
-
- /*
- * Initialize the PostScript text data...
- */
-
- fonts = (ps_text_t *)calloc(1, sizeof(ps_text_t));
- fonts->size = -1.0;
- fonts->style = -1;
-
- /*
- * Load the PostScript glyph names...
- */
-
- snprintf(filename, sizeof(filename), "%s/data/psglyphs", cups_datadir);
-
- if ((fp = fopen(filename, "r")) != NULL)
- {
- while (fscanf(fp, "%x%63s", &unicode, glyph) == 2)
- fonts->glyphs[unicode] = _cupsStrAlloc(glyph);
-
- fclose(fp);
- }
- else
- {
- _cupsLangPrintError("ERROR", _("Unable to open print file"));
- fprintf(stderr, "DEBUG: Unable to open \"%s\".\n", filename);
- exit(1);
- }
-
- /*
- * Open the UTF-8 character set definition...
- */
-
- snprintf(filename, sizeof(filename), "%s/charsets/utf-8", cups_datadir);
-
- if ((fp = fopen(filename, "r")) == NULL)
- {
- /*
- * Can't open charset file!
- */
-
- _cupsLangPrintError("ERROR", _("Unable to open print file"));
- fprintf(stderr, "DEBUG: Unable to open \"%s\".\n", filename);
- exit(1);
- }
-
- if (!fgets(line, sizeof(line), fp) || strncmp(line, "charset utf8", 12))
- {
- /*
- * Bad/empty charset file!
- */
-
- fclose(fp);
- _cupsLangPrintFilter(stderr, "ERROR", _("Bad charset file \"%s\"."),
- filename);
- exit(1);
- }
-
- /*
- * Read the font descriptions...
- */
-
- fonts->unique = cupsArrayNew((cups_array_func_t)strcmp, NULL);
-
- while (fgets(line, sizeof(line), fp) != NULL)
- {
- /*
- * Skip comment and blank lines...
- */
-
- if (line[0] == '#' || line[0] == '\n')
- continue;
-
- /*
- * Read the font descriptions that should look like:
- *
- * start end direction width normal [bold italic bold-italic]
- */
-
- lineptr = line;
-
- start = strtol(lineptr, &lineptr, 16);
- end = strtol(lineptr, &lineptr, 16);
-
- while (isspace(*lineptr & 255))
- lineptr ++;
-
- valptr = lineptr;
-
- while (!isspace(*lineptr & 255) && *lineptr)
- lineptr ++;
-
- if (!*lineptr)
- {
- /*
- * Can't have a font without all required values...
- */
-
- _cupsLangPrintFilter(stderr, "ERROR",
- _("Bad font description line \"%s\"."), valptr);
- fclose(fp);
- exit(1);
- }
-
- *lineptr++ = '\0';
-
- if (!strcmp(valptr, "ltor"))
- fonts->directions[fonts->num_fonts] = 1;
- else if (!strcmp(valptr, "rtol"))
- fonts->directions[fonts->num_fonts] = -1;
- else
- {
- _cupsLangPrintFilter(stderr, "ERROR", _("Bad text direction \"%s\"."),
- valptr);
- fclose(fp);
- exit(1);
- }
-
- /*
- * Got the direction, now get the width...
- */
-
- while (isspace(*lineptr & 255))
- lineptr ++;
-
- valptr = lineptr;
-
- while (!isspace(*lineptr & 255) && *lineptr)
- lineptr ++;
-
- if (!*lineptr)
- {
- /*
- * Can't have a font without all required values...
- */
-
- _cupsLangPrintFilter(stderr, "ERROR",
- _("Bad font description line \"%s\"."), valptr);
- fclose(fp);
- exit(1);
- }
-
- *lineptr++ = '\0';
-
- if (!strcmp(valptr, "single"))
- fonts->widths[fonts->num_fonts] = 1;
- else if (!strcmp(valptr, "double"))
- fonts->widths[fonts->num_fonts] = 2;
- else
- {
- _cupsLangPrintFilter(stderr, "ERROR", _("Bad text width \"%s\"."),
- valptr);
- fclose(fp);
- exit(1);
- }
-
- /*
- * Get the fonts...
- */
-
- for (i = 0; *lineptr && i < 4; i ++)
- {
- while (isspace(*lineptr & 255))
- lineptr ++;
-
- valptr = lineptr;
-
- while (!isspace(*lineptr & 255) && *lineptr)
- lineptr ++;
-
- if (*lineptr)
- *lineptr++ = '\0';
-
- if (lineptr > valptr)
- {
- if (!cupsArrayFind(fonts->unique, valptr))
- cupsArrayAdd(fonts->unique, _cupsStrAlloc(valptr));
-
- fonts->fonts[fonts->num_fonts][i] = _cupsStrAlloc(valptr);
- }
- }
-
- /*
- * Fill in remaining fonts as needed...
- */
-
- for (j = i; j < 4; j ++)
- fonts->fonts[fonts->num_fonts][j] =
- _cupsStrAlloc(fonts->fonts[fonts->num_fonts][0]);
-
- /*
- * Define the character mappings...
- */
-
- for (i = start, j = fonts->num_fonts * 256; i <= end; i ++, j ++)
- {
- fonts->chars[i] = j;
- fonts->codes[j] = i;
- }
-
- /*
- * Move to the next font, stopping if needed...
- */
-
- fonts->num_fonts ++;
- if (fonts->num_fonts >= 256)
- break;
- }
-
- fclose(fp);
-
- if (cupsArrayCount(fonts->unique) == 0)
- {
- _cupsLangPrintFilter(stderr, "ERROR", _("No fonts in charset file."));
- exit(1);
- }
-
- return (fonts);
-}
-
-
-/*
- * 'psTextUTF8()' - Output UTF-8 text at the current position.
- */
-
-void
-psTextUTF8(ps_text_t *fonts, /* I - Font data */
- float size, /* I - Size in points */
- int style, /* I - Style */
- int align, /* I - Alignment */
- const char *text) /* I - UTF-8 text */
-{
- cups_utf32_t utf32[2048]; /* Temporary buffer */
- int utf32len; /* Number of characters */
-
-
- if (!text)
- {
- puts("");
- return;
- }
-
- if ((utf32len = cupsUTF8ToUTF32(utf32, (cups_utf8_t *)text,
- (int)(sizeof(utf32) / sizeof(utf32[0])))) > 0)
- psTextUTF32(fonts, size, style, align, utf32, utf32len);
-}
-
-
-/*
- * 'psTextUTF32()' - Output UTF-32 text at the current position.
- */
-
-void
-psTextUTF32(ps_text_t *fonts, /* I - Font data */
- float size, /* I - Size in points */
- int style, /* I - Font style */
- int align, /* I - Alignment */
- const cups_utf32_t *text, /* I - UTF-32 text */
- int textlen) /* I - Length of text */
-{
- if (size != fonts->size || style != fonts->style)
- {
- printf("/%s findfont %g scalefont setfont\n", ps_font_names[style], size);
- fonts->size = size;
- fonts->style = style;
- }
-
- putchar('<');
- while (textlen > 0)
- {
- printf("%04x", fonts->chars[*text]);
- text ++;
- textlen --;
- }
-
- if (align == PS_CENTER)
- puts(">showcenter");
- else if (align == PS_RIGHT)
- puts(">showright");
- else
- puts(">showleft");
-}
-
-
-/*
- * End of "$Id: pstext.c 9533 2011-02-16 21:33:17Z mike $".
- */