freebsd-ports/print/ghostscript7/files/patch-src:gdevpdfw.c
Mark Linimon 9fa169b13c Handle NeverEmbed CJK TrueType into PDF, and write correct glyph widths
of CJK TrueType into PDF, and do not write CIDToGIDMap of NeverEmbed CJK
TrueType and Encoding of CIDFont into PDF.

PR:		ports/62078
Submitted by:	KOMATSU Shinichiro <koma2 at jiro dot c dot u-tokyo dot ac dot jp>
Reviewed by:	KATO Tsuguru <jungle at m8 dot dion dot ne dot jp>
2004-05-28 02:55:46 +00:00

60 lines
2 KiB
C

--- src/gdevpdfw.c.org 2003-01-17 09:49:02.000000000 +0900
+++ src/gdevpdfw.c 2003-09-25 17:50:54.000000000 +0900
@@ -348,18 +348,19 @@
/* Use the most common width as DW. */
{
- ushort counts[1001];
+ ushort counts[1500*2]; /* histogram of (-1500..1500) */
int dw_count = 0, i;
memset(counts, 0, sizeof(counts));
while (!psf_enumerate_glyphs_next(&genum, &glyph)) {
- int width = ppf->Widths[glyph - gs_min_cid_glyph];
+ int cid = glyph - gs_min_cid_glyph;
+ int width = ppf->Widths[cid];
- counts[min(width, countof(counts) - 1)]++;
+ counts[max(0,min(width+countof(counts)/2,countof(counts)-1))]++;
}
- for (i = 0; i < countof(counts); ++i)
+ for (i = 0; i < countof(counts); i++)
if (counts[i] > dw_count)
- dw = i, dw_count = counts[i];
+ dw = i - countof(counts)/2, dw_count = counts[i];
if (dw != 0)
pprintd1(s, "/DW %d\n", dw);
}
@@ -496,14 +497,16 @@
if (pdf_has_subset_prefix(chars, size))
chars += SUBSET_PREFIX_SIZE, size -= SUBSET_PREFIX_SIZE;
pdf_put_name(pdev, chars, size);
- if (pef->sub_font_type == ft_CID_encrypted &&
+ if ((pef->sub_font_type == ft_CID_encrypted ||
+ pef->sub_font_type == ft_CID_TrueType) &&
pef->cmapname[0] == '/'
) {
stream_putc(s, '-');
pdf_put_name_chars(pdev, (const byte*) (pef->cmapname + 1),
strlen(pef->cmapname + 1));
}
- pprints1(s, "/Encoding %s", pef->cmapname);
+ pprints1(s, (pef->cmapname[0] == '/') ? "/Encoding%s" : "/Encoding %s",
+ pef->cmapname);
pprintld1(s, "/DescendantFonts[%ld 0 R]",
pdf_resource_id((const pdf_resource_t *)pef->DescendantFont));
write_Widths = 0;
@@ -563,8 +566,10 @@
break;
case -1:
pdf_write_CIDFont_widths(pdev, pef);
- if (pef->FontType == ft_CID_TrueType)
- pdf_write_CIDToGIDMap(pdev, pef, &cidmap_id);
+ if (pef->FontType == ft_CID_TrueType) {
+ if (pef->embed != FONT_EMBED_NO)
+ pdf_write_CIDToGIDMap(pdev, pef, &cidmap_id);
+ }
break;
}
if (pef->Differences) {