summaryrefslogtreecommitdiff
path: root/src/pdflib/font/ft_cid.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pdflib/font/ft_cid.c')
-rw-r--r--src/pdflib/font/ft_cid.c295
1 files changed, 295 insertions, 0 deletions
diff --git a/src/pdflib/font/ft_cid.c b/src/pdflib/font/ft_cid.c
new file mode 100644
index 0000000..aff9784
--- /dev/null
+++ b/src/pdflib/font/ft_cid.c
@@ -0,0 +1,295 @@
+/*---------------------------------------------------------------------------*
+ | 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: ft_cid.c,v 1.1 2008/10/17 06:10:43 scuri Exp $
+ *
+ * FONT CID functions
+ *
+ */
+
+#define FT_CID_C
+
+#include <errno.h>
+
+#include "ft_font.h"
+#include "pc_file.h"
+
+/* ------------------------ Predefined CMaps ------------------------ */
+
+/* Predefined CMaps and the corresponding character collection */
+static const fnt_cmap_info fnt_predefined_cmaps[] =
+{
+ { "83pv-RKSJ-H", cc_japanese, 0, PDC_1_3, 1, 1, 1, 1, 0},
+ { "90ms-RKSJ-H", cc_japanese, 0, PDC_1_3, 2, 2, 2, 2, 0},
+ { "90ms-RKSJ-V", cc_japanese, 0, PDC_1_3, 2, 2, 2, 2, 1},
+ { "90msp-RKSJ-H", cc_japanese, 0, PDC_1_3, 2, 2, 2, 2, 0},
+ { "90msp-RKSJ-V", cc_japanese, 0, PDC_1_3, 2, 2, 2, 2, 1},
+ { "90pv-RKSJ-H", cc_japanese, 0, PDC_1_3, 1, 1, 1, 1, 0},
+ { "Add-RKSJ-H", cc_japanese, 0, PDC_1_3, 1, 1, 1, 1, 0},
+ { "Add-RKSJ-V", cc_japanese, 0, PDC_1_3, 1, 1, 1, 1, 1},
+ { "EUC-H", cc_japanese, 0, PDC_1_3, 1, 1, 1, 1, 0},
+ { "EUC-V", cc_japanese, 0, PDC_1_3, 1, 1, 1, 1, 1},
+ { "Ext-RKSJ-H", cc_japanese, 0, PDC_1_3, 2, 2, 2, 2, 0},
+ { "Ext-RKSJ-V", cc_japanese, 0, PDC_1_3, 2, 2, 2, 2, 1},
+ { "H", cc_japanese, 0, PDC_1_3, 1, 1, 1, 1, 0},
+ { "V", cc_japanese, 0, PDC_1_3, 1, 1, 1, 1, 1},
+ { "UniJIS-UCS2-H", cc_japanese, 2, PDC_1_3, 2, 4, 4, 6, 0},
+ { "UniJIS-UCS2-V", cc_japanese, 2, PDC_1_3, 2, 4, 4, 6, 1},
+ { "UniJIS-UCS2-HW-H", cc_japanese,-2, PDC_1_3, 2, 4, 4, 6, 0},
+ { "UniJIS-UCS2-HW-V", cc_japanese -2, PDC_1_3, 2, 4, 4, 6, 1},
+ { "UniJIS-UTF16-H", cc_japanese, 2, PDC_1_5, 0, 0, 5, 6, 0},
+ { "UniJIS-UTF16-V", cc_japanese, 2, PDC_1_5, 0, 0, 5, 6, 1},
+
+ { "GB-EUC-H", cc_simplified_chinese, 0, PDC_1_3, 0, 0, 0, 0, 0},
+ { "GB-EUC-V", cc_simplified_chinese, 0, PDC_1_3, 0, 0, 0, 0, 1},
+ { "GBpc-EUC-H", cc_simplified_chinese, 0, PDC_1_3, 0, 0, 0, 0, 0},
+ { "GBpc-EUC-V", cc_simplified_chinese, 0, PDC_1_3, 0, 0, 0, 0, 1},
+ { "GBK-EUC-H", cc_simplified_chinese, 0, PDC_1_3, 2, 2, 2, 2, 0},
+ { "GBK-EUC-V", cc_simplified_chinese, 0, PDC_1_3, 2, 2, 2, 2, 1},
+ { "GBKp-EUC-H", cc_simplified_chinese, 0, PDC_1_4, 0, 2, 2, 2, 0},
+ { "GBKp-EUC-V", cc_simplified_chinese, 0, PDC_1_4, 0, 2, 2, 2, 1},
+ { "GBK2K-H", cc_simplified_chinese, 0, PDC_1_4, 0, 4, 4, 4, 0},
+ { "GBK2K-V", cc_simplified_chinese, 0, PDC_1_4, 0, 4, 4, 4, 1},
+ { "UniGB-UCS2-H", cc_simplified_chinese, 2, PDC_1_3, 2, 4, 4, 4, 0},
+ { "UniGB-UCS2-V", cc_simplified_chinese, 2, PDC_1_3, 2, 4, 4, 4, 1},
+ { "UniGB-UTF16-H", cc_simplified_chinese, 2, PDC_1_5, 0, 0, 4, 4, 0},
+ { "UniGB-UTF16-V", cc_simplified_chinese, 2, PDC_1_5, 0, 0, 4, 4, 1},
+
+ { "B5pc-H", cc_traditional_chinese, 0, PDC_1_3, 0, 0, 0, 0, 0},
+ { "B5pc-V", cc_traditional_chinese, 0, PDC_1_3, 0, 0, 0, 0, 1},
+ { "HKscs-B5-H", cc_traditional_chinese, 0, PDC_1_4, 0, 3, 3, 3, 0},
+ { "HKscs-B5-V", cc_traditional_chinese, 0, PDC_1_4, 0, 3, 3, 3, 1},
+ { "ETen-B5-H", cc_traditional_chinese, 0, PDC_1_3, 0, 0, 0, 0, 0},
+ { "ETen-B5-V", cc_traditional_chinese, 0, PDC_1_3, 0, 0, 0, 0, 1},
+ { "ETenms-B5-H", cc_traditional_chinese, 0, PDC_1_3, 0, 0, 0, 0, 0},
+ { "ETenms-B5-V", cc_traditional_chinese, 0, PDC_1_3, 0, 0, 0, 0, 1},
+ { "CNS-EUC-H", cc_traditional_chinese, 0, PDC_1_3, 0, 0, 0, 0, 0},
+ { "CNS-EUC-V", cc_traditional_chinese, 0, PDC_1_3, 0, 0, 0, 0, 1},
+ { "UniCNS-UCS2-H", cc_traditional_chinese, 2, PDC_1_3, 0, 3, 3, 3, 0},
+ { "UniCNS-UCS2-V", cc_traditional_chinese, 2, PDC_1_3, 0, 3, 3, 3, 1},
+ { "UniCNS-UTF16-H", cc_traditional_chinese, 2, PDC_1_5, 0, 0, 4, 4, 0},
+ { "UniCNS-UTF16-V", cc_traditional_chinese, 2, PDC_1_5, 0, 0, 4, 4, 1},
+
+ { "KSC-EUC-H", cc_korean, 0, PDC_1_3, 0, 0, 0, 0, 0},
+ { "KSC-EUC-V", cc_korean, 0, PDC_1_3, 0, 0, 0, 0, 1},
+ { "KSCms-UHC-H", cc_korean, 0, PDC_1_3, 1, 1, 1, 1, 0},
+ { "KSCms-UHC-V", cc_korean, 0, PDC_1_3, 1, 1, 1, 1, 1},
+ { "KSCms-UHC-HW-H", cc_korean, 0, PDC_1_3, 1, 1, 1, 1, 0},
+ { "KSCms-UHC-HW-V", cc_korean, 0, PDC_1_3, 1, 1, 1, 1, 1},
+ { "KSCpc-EUC-H", cc_korean, 0, PDC_1_3, 0, 0, 0, 0, 0},
+ { "UniKS-UCS2-H", cc_korean, 2, PDC_1_3, 1, 1, 1, 1, 0},
+ { "UniKS-UCS2-V", cc_korean, 2, PDC_1_3, 1, 1, 1, 1, 1},
+ { "UniKS-UTF16-H", cc_korean, 2, PDC_1_5, 0, 0, 2, 2, 0},
+ { "UniKS-UTF16-V", cc_korean, 2, PDC_1_5, 0, 0, 2, 2, 1},
+
+ { "Identity-H", cc_identity, 0, PDC_1_3, 0, 0, 0, 0, 0},
+ { "Identity-V", cc_identity, 0, PDC_1_3, 0, 0, 0, 0, 1},
+
+ { NULL, 0, 0, 0, 0, 0, 0, 0, 0},
+};
+
+static int
+fnt_get_predefined_cmap_slot(const char *cmapname)
+{
+ int slot;
+
+ for (slot = 0; ; slot++)
+ {
+ if (fnt_predefined_cmaps[slot].name == NULL)
+ {
+ slot = -1;
+ break;
+ }
+ if (!strcmp(fnt_predefined_cmaps[slot].name, cmapname))
+ break;
+ }
+
+ return slot;
+}
+
+int
+fnt_get_predefined_cmap_info(const char *cmapname, fnt_cmap_info *cmapinfo)
+{
+ int slot;
+
+ slot = fnt_get_predefined_cmap_slot(cmapname);
+
+ if (slot == -1)
+ return cc_none;
+
+ if (cmapinfo)
+ *cmapinfo = fnt_predefined_cmaps[slot];
+
+ return fnt_predefined_cmaps[slot].charcoll;
+}
+
+static const pdc_keyconn fnt_charcoll_keylist[] =
+{
+ { "Japan1", cc_japanese},
+ { "GB1", cc_simplified_chinese},
+ { "CNS1", cc_traditional_chinese},
+ { "Korea1", cc_korean},
+ { "Identity", cc_identity},
+ { "Unknown", cc_unknown},
+ { NULL, 0}
+};
+
+const char *
+fnt_get_ordering_cid(int charcoll)
+{
+ return pdc_get_keyword(charcoll, fnt_charcoll_keylist);
+}
+
+int
+fnt_get_charcoll(const char *ordering)
+{
+ int charcoll;
+
+ charcoll = (int) pdc_get_keycode(ordering, fnt_charcoll_keylist);
+
+ if (charcoll == PDC_KEY_NOTFOUND)
+ return cc_unknown;
+ else
+ return charcoll;
+}
+
+int
+fnt_get_supplement(fnt_cmap_info *cmapinfo, int compatibility)
+{
+ int retval = 0;
+
+ switch(compatibility)
+ {
+ case PDC_1_3:
+ retval = cmapinfo->supplement13;
+ break;
+
+ case PDC_1_4:
+ retval = cmapinfo->supplement14;
+ break;
+
+ case PDC_1_5:
+ retval = cmapinfo->supplement15;
+ break;
+
+ default:
+ case PDC_1_6:
+ retval = cmapinfo->supplement16;
+ break;
+ }
+
+ return retval;
+}
+
+/*
+ * See:
+ * Adobe Technical Note #5078 (Japanese1)
+ * Adobe Technical Note #5079 (GB1)
+ * Adobe Technical Note #5080 (CNS1)
+ * Adobe Technical Note #5093 (Korea1)
+ *
+ */
+
+int
+fnt_get_maxcid(int charcoll, int supplement)
+{
+ switch(charcoll)
+ {
+ case cc_japanese:
+ switch(supplement)
+ {
+ case 0:
+ return 8283;
+
+ case 1:
+ return 8358;
+
+ case 2:
+ return 8719;
+
+ case 3:
+ return 9353;
+
+ case 4:
+ return 15443;
+
+ case 5:
+ return 20316;
+
+ case 6:
+ default:
+ return 23057;
+ }
+
+ case cc_simplified_chinese:
+ switch(supplement)
+ {
+ case 0:
+ return 7716;
+
+ case 1:
+ return 9896;
+
+ case 2:
+ return 22126;
+
+ case 3:
+ return 22352;
+
+ case 4:
+ default:
+ return 29063;
+ }
+
+ case cc_traditional_chinese:
+ switch(supplement)
+ {
+ case 0:
+ return 14098;
+
+ case 1:
+ return 17407;
+
+ case 2:
+ return 17600;
+
+ case 3:
+ return 18845;
+
+ case 4:
+ default:
+ return 18964;
+ }
+
+ case cc_korean:
+ switch(supplement)
+ {
+ case 0:
+ return 9332;
+
+ case 1:
+ return 18154;
+
+ case 2:
+ default:
+ return 18351;
+ }
+
+ case cc_identity:
+ case cc_unknown:
+ return FNT_MAXCID;
+
+ default:
+ return 0;
+ }
+}
+