summaryrefslogtreecommitdiff
path: root/src/pdflib/pdflib/p_encoding.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pdflib/pdflib/p_encoding.c')
-rw-r--r--src/pdflib/pdflib/p_encoding.c187
1 files changed, 187 insertions, 0 deletions
diff --git a/src/pdflib/pdflib/p_encoding.c b/src/pdflib/pdflib/p_encoding.c
new file mode 100644
index 0000000..af24792
--- /dev/null
+++ b/src/pdflib/pdflib/p_encoding.c
@@ -0,0 +1,187 @@
+/*---------------------------------------------------------------------------*
+ | PDFlib - A library for generating PDF on the fly |
+ +---------------------------------------------------------------------------+
+ | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. |
+ +---------------------------------------------------------------------------+
+ | |
+ | This software is subject to the PDFlib license. It is NOT in the |
+ | public domain. Extended versions and commercial licenses are |
+ | available, please check http://www.pdflib.com. |
+ | |
+ *---------------------------------------------------------------------------*/
+
+/* $Id: p_encoding.c,v 1.1 2008/10/17 06:11:49 scuri Exp $
+ *
+ * PDFlib encoding handling routines
+ *
+ */
+
+#include "p_intern.h"
+#include "p_font.h"
+
+void
+pdf__encoding_set_char(PDF *p, const char *encoding, int slot,
+ const char *glyphname, int uv)
+{
+ int enc;
+ pdc_encodingvector *ev;
+ char given;
+
+ if (!encoding || !*encoding)
+ pdc_error(p->pdc, PDC_E_ILLARG_EMPTY, "encoding", 0, 0, 0);
+
+ if (slot < 0 || slot > 255)
+ pdc_error(p->pdc, PDC_E_ILLARG_INT,
+ "slot", pdc_errprintf(p->pdc, "%d", slot), 0, 0);
+
+ if (uv < 0 || uv >= PDC_NUM_BMPVAL)
+ pdc_error(p->pdc, PDC_E_ILLARG_INT,
+ "uv", pdc_errprintf(p->pdc, "%d", uv), 0, 0);
+
+ if (!glyphname || !*glyphname)
+ {
+ if (uv == 0)
+ pdc_error(p->pdc, PDF_E_ENC_GLYPHORCODE, 0, 0, 0, 0);
+ }
+
+ for (enc = (int) pdc_invalidenc + 1; enc < (int) pdc_firstvarenc; enc++)
+ {
+ if (!strcmp(encoding, pdc_get_fixed_encoding_name((pdc_encoding) enc)))
+ pdc_error(p->pdc, PDF_E_ENC_CANTCHANGE, encoding, 0, 0, 0);
+ }
+
+ if (uv == 0)
+ {
+ given = 1;
+ uv = (int) pdc_insert_glyphname(p->pdc, glyphname);
+ }
+ else if (!glyphname || !*glyphname)
+ {
+ given = 0;
+ glyphname = pdc_insert_unicode(p->pdc, (pdc_ushort) uv);
+ }
+ else
+ {
+ const char *reg_glyphname;
+ pdc_ushort reg_uv;
+ int retval;
+
+ given = 1;
+ reg_glyphname = pdc_unicode2glyphname(p->pdc, (pdc_ushort) uv);
+ if (reg_glyphname)
+ {
+ if (strcmp(reg_glyphname, glyphname) &&
+ p->debug[(int) 'F'] == pdc_true)
+ {
+ pdc_warning(p->pdc, PDF_E_ENC_BADGLYPH,
+ glyphname,
+ pdc_errprintf(p->pdc, "%04X", uv),
+ reg_glyphname, 0);
+ }
+
+ /* We take the registered name */
+ }
+ else
+ {
+ retval = pdc_glyphname2unicode(p->pdc, glyphname);
+ if (retval > -1)
+ {
+ reg_uv = (pdc_ushort) retval;
+ if (reg_uv && reg_uv != (pdc_ushort) uv &&
+ p->debug[(int) 'F'] == pdc_true)
+ {
+ pdc_error(p->pdc, PDF_E_ENC_BADUNICODE,
+ pdc_errprintf(p->pdc, "%04X", uv), glyphname,
+ pdc_errprintf(p->pdc, "%04X", reg_uv), 0);
+ }
+ }
+
+ /* We register the new glyph name and unicode value */
+ pdc_register_glyphname(p->pdc, glyphname, (pdc_ushort) uv,
+ pdc_false);
+ }
+ }
+
+ /* search for a registered encoding */
+ enc = pdc_find_encoding(p->pdc, encoding);
+
+ /* not found */
+ if (enc == pdc_invalidenc)
+ {
+ ev = pdc_new_encoding(p->pdc, encoding);
+ ev->flags |= PDC_ENC_USER;
+ ev->flags |= PDC_ENC_SETNAMES;
+ ev->flags |= PDC_ENC_ALLOCCHARS;
+
+ enc = pdc_insert_encoding_vector(p->pdc, ev);
+ }
+
+ /* encoding vector */
+ ev = pdc_get_encoding_vector(p->pdc, (pdc_encoding)enc);
+ if (!(ev->flags & PDC_ENC_USER))
+ {
+ pdc_error(p->pdc, PDF_E_ENC_CANTCHANGE, encoding, 0, 0, 0);
+ }
+ else if (ev->flags & PDC_ENC_USED)
+ {
+ pdc_error(p->pdc, PDF_E_ENC_INUSE, encoding, 0, 0, 0);
+ }
+
+ /* Free character name */
+ if (ev->chars[slot] != NULL)
+ pdc_free(p->pdc, ev->chars[slot]);
+
+ /* Saving */
+ ev->codes[slot] = (pdc_ushort) uv;
+ if (glyphname != NULL)
+ ev->chars[slot] = pdc_strdup(p->pdc, glyphname);
+ ev->given[slot] = given;
+
+ pdc_encoding_logg_protocol(p->pdc, ev);
+}
+
+pdc_encoding
+pdf_get_hypertextencoding_param(PDF *p, int *codepage)
+{
+ if (p->hypertextencoding == pdc_invalidenc)
+ {
+ p->hypertextencoding = pdf_get_hypertextencoding(p, "auto",
+ &p->hypertextcodepage, pdc_true);
+
+ if (p->hypertextencoding == pdc_invalidenc)
+ pdc_error(p->pdc, -1, 0, 0, 0, 0);
+ }
+
+ if (codepage)
+ *codepage = p->hypertextcodepage;
+
+ return p->hypertextencoding;
+}
+
+pdc_encoding
+pdf_get_hypertextencoding(PDF *p, const char *encoding, int *codepage,
+ pdc_bool verbose)
+{
+ pdc_encoding enc = pdc_invalidenc;
+
+ *codepage = 0;
+
+ if (!*encoding)
+ {
+ enc = pdc_unicode;
+ }
+ else
+ {
+ {
+ enc = pdc_get_encoding(p->pdc, encoding, codepage, verbose);
+ if (enc < 0 && enc != pdc_invalidenc && enc != pdc_unicode)
+ {
+ pdc_set_errmsg(p->pdc, PDF_E_ENC_BADHYPTEXTENC, encoding,
+ 0, 0, 0);
+ enc = pdc_invalidenc;
+ }
+ }
+ }
+
+ return enc;
+}