Files correlati : pdflib Ricompilazione Demo : [ ] Commento : Aggiornata pdflib.dll alla versione 7.0.4 git-svn-id: svn://10.65.10.50/trunk@18580 c028cbd2-c16b-5b4b-a496-9718f37d4682
412 lines
11 KiB
C
Executable File
412 lines
11 KiB
C
Executable File
/*---------------------------------------------------------------------------*
|
|
| 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_corefont.c,v 1.3 2009-03-23 08:51:17 guy Exp $
|
|
*
|
|
* FONT in-core and basic font metric functions
|
|
*
|
|
*/
|
|
|
|
#define FT_COREFONT_C
|
|
|
|
#include "ft_font.h"
|
|
#include "ft_corefont.h"
|
|
|
|
|
|
/* ------------------------------ core fonts ------------------------------ */
|
|
|
|
/* PDF basic font names */
|
|
static const char *fnt_base14_names[] =
|
|
{
|
|
"Courier",
|
|
"Courier-Bold",
|
|
"Courier-Oblique",
|
|
"Courier-BoldOblique",
|
|
"Helvetica",
|
|
"Helvetica-Bold",
|
|
"Helvetica-Oblique",
|
|
"Helvetica-BoldOblique",
|
|
"Symbol",
|
|
"Times-Roman",
|
|
"Times-Bold",
|
|
"Times-Italic",
|
|
"Times-BoldItalic",
|
|
"ZapfDingbats"
|
|
};
|
|
|
|
pdc_bool
|
|
fnt_is_standard_font(const char *fontname)
|
|
{
|
|
int slot;
|
|
|
|
for (slot = 0;
|
|
slot < (int)(sizeof(fnt_base14_names) / sizeof(fnt_base14_names[0]));
|
|
slot++)
|
|
{
|
|
if (!strcmp(fnt_base14_names[slot], fontname))
|
|
return pdc_true;
|
|
}
|
|
|
|
return pdc_false;
|
|
}
|
|
|
|
/* abbreviations of PDF basic font names for form fields */
|
|
static const char *fnt_abb_base14_names[] =
|
|
{
|
|
"Cour",
|
|
"CoBo",
|
|
"CoOb",
|
|
"CoBO",
|
|
"Helv",
|
|
"HeBo",
|
|
"HeOb",
|
|
"HeBO",
|
|
"Symb",
|
|
"TiRo",
|
|
"TiBo",
|
|
"TiIt",
|
|
"TiBI",
|
|
"ZaDb"
|
|
};
|
|
|
|
const char *
|
|
fnt_get_abb_std_fontname(const char *fontname)
|
|
{
|
|
int slot;
|
|
|
|
for (slot = 0;
|
|
slot < (int)(sizeof(fnt_base14_names) / sizeof(fnt_base14_names[0]));
|
|
slot++)
|
|
{
|
|
if (!strcmp(fnt_base14_names[slot], fontname))
|
|
return fnt_abb_base14_names[slot];
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
/* Basic fonts core metrics */
|
|
static const fnt_font_metric *fnt_base_font_metrics[] =
|
|
{
|
|
&fnt_font_metric_01,
|
|
&fnt_font_metric_02,
|
|
&fnt_font_metric_03,
|
|
&fnt_font_metric_04,
|
|
&fnt_font_metric_05,
|
|
&fnt_font_metric_06,
|
|
&fnt_font_metric_07,
|
|
&fnt_font_metric_08,
|
|
&fnt_font_metric_09,
|
|
&fnt_font_metric_10,
|
|
&fnt_font_metric_11,
|
|
&fnt_font_metric_12,
|
|
&fnt_font_metric_13,
|
|
&fnt_font_metric_14
|
|
};
|
|
|
|
const fnt_font_metric *
|
|
fnt_get_core_metric(const char *fontname)
|
|
{
|
|
#ifdef PDF_BUILTINMETRIC_SUPPORTED
|
|
const fnt_font_metric *metric = NULL;
|
|
int slot;
|
|
|
|
for (slot = 0;
|
|
slot < (int)(sizeof(fnt_base_font_metrics) /
|
|
sizeof(fnt_base_font_metrics[0]));
|
|
slot++)
|
|
{
|
|
metric = fnt_base_font_metrics[slot];
|
|
if (!strcmp(metric->name, fontname))
|
|
return metric;
|
|
}
|
|
#endif /* PDF_BUILTINMETRIC_SUPPORTED */
|
|
return(NULL);
|
|
}
|
|
|
|
|
|
/* --------------------- Pre-installed CID fonts ---------------------- */
|
|
|
|
int
|
|
fnt_get_preinstalled_cidfont(const char *fontname,
|
|
const fnt_font_metric **fontmetric)
|
|
{
|
|
int slot;
|
|
|
|
for (slot = 0; slot < FNT_NUM_OF_CIDFONTS; slot++)
|
|
{
|
|
if (!strcmp(fnt_cid_metrics[slot].name, fontname))
|
|
{
|
|
if (fontmetric)
|
|
*fontmetric = &fnt_cid_metrics[slot];
|
|
return fnt_cid_metrics[slot].charcoll;
|
|
}
|
|
}
|
|
|
|
if (fontmetric)
|
|
*fontmetric = NULL;
|
|
|
|
return (int) cc_none;
|
|
}
|
|
|
|
/* abbreviations of PDF basic CJK font names for form fields */
|
|
static const char *fnt_abb_cjk_names[] =
|
|
{
|
|
"KaGo",
|
|
"KaMi",
|
|
"HyGo",
|
|
"HySm",
|
|
"MHei",
|
|
"MSun",
|
|
"STSo",
|
|
};
|
|
|
|
const char *
|
|
fnt_get_abb_cjk_fontname(const char *fontname)
|
|
{
|
|
int slot;
|
|
|
|
for (slot = 0;
|
|
slot < (int)(sizeof(fnt_abb_cjk_names) / sizeof(fnt_abb_cjk_names[0]));
|
|
slot++)
|
|
{
|
|
if (!strcmp(fnt_cid_metrics[slot].name, fontname))
|
|
return fnt_abb_cjk_names[slot];
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
#ifdef PDF_CJKFONTWIDTHS_SUPPORTED
|
|
|
|
const char **
|
|
fnt_get_cid_widths_array(pdc_core *pdc, fnt_font *font)
|
|
{
|
|
int slot, slotm;
|
|
|
|
(void) pdc;
|
|
|
|
/* search for font name */
|
|
slotm = 100;
|
|
for (slot = 0; slot < slotm; slot += FNT_CIDMETRIC_INCR)
|
|
{
|
|
if (!strcmp(fnt_cid_width_arrays[slot], font->name))
|
|
break;
|
|
}
|
|
|
|
return &fnt_cid_width_arrays[slot + 1]; /* skip font name */
|
|
}
|
|
|
|
static void
|
|
fnt_parse_cid_widths(pdc_core *pdc, fnt_font *font)
|
|
{
|
|
static const char fn[] = "fnt_parse_cid_widths";
|
|
int slot, slota, slotm;
|
|
const char *chunk;
|
|
char **strlist = NULL, **sstrlist = NULL, *str;
|
|
int cid = 0, cidfirst, cidlast, width;
|
|
int il, is, ns, nss = 0;
|
|
int wformat = 2;
|
|
|
|
/* search for font name */
|
|
slotm = 100;
|
|
for (slot = 0; slot < slotm; slot += FNT_CIDMETRIC_INCR)
|
|
{
|
|
if (!strcmp(fnt_cid_width_arrays[slot], font->name))
|
|
break;
|
|
}
|
|
if (slot == slotm)
|
|
return;
|
|
|
|
/* we take the maximum */
|
|
font->m.numwidths = fnt_get_maxcid(font->m.charcoll, -1) + 1;
|
|
font->m.widths = (int *) pdc_malloc(pdc,
|
|
font->m.numwidths * sizeof(int), fn);
|
|
|
|
slota = slot + 1; /* skip font name */
|
|
slotm = slot + FNT_CIDMETRIC_INCR;
|
|
for (slot = slota; slot < slotm; slot++)
|
|
{
|
|
chunk = fnt_cid_width_arrays[slot];
|
|
|
|
ns = pdc_split_stringlist(pdc, chunk, " \n", 0, &strlist);
|
|
for (is = 0; is < ns; is++)
|
|
{
|
|
str = strlist[is];
|
|
|
|
/* check for next format 1 chunk */
|
|
if (wformat == 2 && strchr(str, '['))
|
|
{
|
|
nss = pdc_split_stringlist(pdc, str, " [", 0, &sstrlist);
|
|
str = sstrlist[0];
|
|
pdc_str2integer(str, 0, &cidfirst);
|
|
for (; cid < cidfirst; cid++)
|
|
font->m.widths[cid] = FNT_DEFAULT_CIDWIDTH;
|
|
str = sstrlist[1];
|
|
wformat = 1;
|
|
}
|
|
|
|
/* format 1: cid [width_1 width_2 ... width_n] */
|
|
if (wformat == 1)
|
|
{
|
|
il = (int) strlen(str) - 1;
|
|
if (str[il] == ']')
|
|
{
|
|
str[il] = 0;
|
|
wformat = 2;
|
|
}
|
|
|
|
pdc_str2integer(str, 0, &font->m.widths[cid]);
|
|
cid++;
|
|
|
|
if (nss)
|
|
{
|
|
pdc_cleanup_stringlist(pdc, sstrlist);
|
|
nss = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* format 2: cid_first cid_last width */
|
|
pdc_str2integer(str, 0, &cidfirst);
|
|
is++;
|
|
str = strlist[is];
|
|
pdc_str2integer(str, 0, &cidlast);
|
|
is++;
|
|
str = strlist[is];
|
|
pdc_str2integer(str, 0, &width);
|
|
|
|
for (; cid < cidfirst; cid++)
|
|
font->m.widths[cid] = FNT_DEFAULT_CIDWIDTH;
|
|
for (; cid <= cidlast; cid++)
|
|
font->m.widths[cid] = width;
|
|
}
|
|
}
|
|
|
|
pdc_cleanup_stringlist(pdc, strlist);
|
|
}
|
|
|
|
for (; cid < font->m.numwidths; cid++)
|
|
font->m.widths[cid] = FNT_DEFAULT_CIDWIDTH;
|
|
|
|
if (pdc_logg_is_enabled(pdc, 5, trc_font))
|
|
{
|
|
for (cid = 0; cid < font->m.numwidths; cid++)
|
|
pdc_logg(pdc, "\t\t\tCID width[%d]: %d\n",
|
|
cid, font->m.widths[cid]);
|
|
}
|
|
}
|
|
|
|
#endif /* PDF_CJKFONTWIDTHS_SUPPORTED */
|
|
|
|
|
|
/* ------------------------- general functions -------------------------- */
|
|
|
|
/*
|
|
* Fill font metric struct from core metric struct
|
|
*/
|
|
void
|
|
fnt_fill_font_metric(pdc_core *pdc, fnt_font *font, pdc_bool kerning,
|
|
const fnt_font_metric *metric)
|
|
{
|
|
static const char fn[] = "fnt_fill_font_metric";
|
|
|
|
(void) kerning;
|
|
|
|
/* Fill font metric struct. Font struct must be initialized */
|
|
font->m = *metric;
|
|
font->m.charcoll = abs(font->m.charcoll);
|
|
font->m.name = pdc_strdup(pdc, metric->name);
|
|
font->name = pdc_strdup(pdc, metric->name);
|
|
|
|
/* Fill glyph widths array (double mapping Unicode <-> code <-> width) */
|
|
if (font->m.numglwidths)
|
|
{
|
|
font->m.glw = (fnt_glyphwidth *) pdc_calloc(pdc,
|
|
metric->numglwidths * sizeof(fnt_glyphwidth), fn);
|
|
memcpy(font->m.glw, metric->glw,
|
|
metric->numglwidths * sizeof(fnt_glyphwidth));
|
|
}
|
|
|
|
/* Fill glyph width array (mapping Unicode interval <-> width) */
|
|
if (metric->numinters)
|
|
{
|
|
/* We must convert */
|
|
if (font->m.type == fnt_Type1)
|
|
{
|
|
int i, j, iw, iwe;
|
|
pdc_ushort uv;
|
|
|
|
for (i = 0; i < metric->numinters; i++)
|
|
{
|
|
if (i && metric->ciw[i-1].width != 0)
|
|
font->m.numglwidths += metric->ciw[i].startcode -
|
|
metric->ciw[i-1].startcode;
|
|
}
|
|
font->m.glw = (fnt_glyphwidth *) pdc_calloc(pdc,
|
|
font->m.numglwidths * sizeof(fnt_glyphwidth), fn);
|
|
|
|
j = 0;
|
|
iw = 0;
|
|
for (i = 0; i < metric->numinters; i++)
|
|
{
|
|
if (i && metric->ciw[j].width != 0)
|
|
{
|
|
uv = metric->ciw[j].startcode;
|
|
iwe = iw + metric->ciw[i].startcode - uv;
|
|
for (; iw < iwe; iw++)
|
|
{
|
|
font->m.glw[iw].unicode = uv;
|
|
font->m.glw[iw].width = metric->ciw[j].width;
|
|
uv++;
|
|
}
|
|
}
|
|
j = i;
|
|
}
|
|
font->m.numinters = 0;
|
|
font->m.ciw = NULL;
|
|
}
|
|
else
|
|
{
|
|
font->m.ciw = (fnt_interwidth *) pdc_calloc(pdc,
|
|
font->m.numinters * sizeof(fnt_interwidth), fn);
|
|
memcpy(font->m.ciw, metric->ciw,
|
|
metric->numinters * sizeof(fnt_interwidth));
|
|
}
|
|
}
|
|
|
|
#ifdef PDF_CJKFONTWIDTHS_SUPPORTED
|
|
/* Fill glyph width array (mapping CID -> width) */
|
|
if (font->m.type == fnt_CIDFontType0)
|
|
fnt_parse_cid_widths(pdc, font);
|
|
#endif /* PDF_CJKFONTWIDTHS_SUPPORTED */
|
|
|
|
/* Number of glyphs */
|
|
if (font->m.type == fnt_Type1)
|
|
font->numglyphs = font->m.numglwidths;
|
|
|
|
|
|
/* font weight */
|
|
font->weight = fnt_stemv2weight(font->m.StdVW);
|
|
|
|
/* standard Adobe font */
|
|
font->isstdfont = pdc_true;
|
|
|
|
/* symbol font */
|
|
if (!(font->m.flags & FNT_SYMBOL))
|
|
font->issymbfont = pdc_false;
|
|
}
|
|
|
|
|
|
|