diff options
Diffstat (limited to 'devices')
-rw-r--r-- | devices/vector/gdevpdtb.c | 4 | ||||
-rw-r--r-- | devices/vector/gdevpdtb.h | 4 | ||||
-rw-r--r-- | devices/vector/gdevpdtt.c | 29 | ||||
-rw-r--r-- | devices/vector/gdevpsdf.h | 11 | ||||
-rw-r--r-- | devices/vector/gdevpsdp.c | 32 |
5 files changed, 72 insertions, 8 deletions
diff --git a/devices/vector/gdevpdtb.c b/devices/vector/gdevpdtb.c index 200f6ec3a..bab7995df 100644 --- a/devices/vector/gdevpdtb.c +++ b/devices/vector/gdevpdtb.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001-2022 Artifex Software, Inc. +/* Copyright (C) 2001-2023 Artifex Software, Inc. All Rights Reserved. This software is provided AS-IS with no warranty, either express or @@ -47,8 +47,6 @@ private_st_pdf_base_font(); gs_private_st_basic(st_pdf_base_font, pdf_base_font_t, "pdf_base_font_t",\ pdf_base_font_ptrs, pdf_base_font_data); -#define SUBSET_PREFIX_SIZE 7 /* XXXXXX+ */ - typedef struct pdf_base14_font_info_s { const char *urwname; const char *stdname; diff --git a/devices/vector/gdevpdtb.h b/devices/vector/gdevpdtb.h index e8540c289..9ddedf374 100644 --- a/devices/vector/gdevpdtb.h +++ b/devices/vector/gdevpdtb.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2001-2021 Artifex Software, Inc. +/* Copyright (C) 2001-2023 Artifex Software, Inc. All Rights Reserved. This software is provided AS-IS with no warranty, either express or @@ -21,6 +21,8 @@ #include "gdevpdtx.h" +#define SUBSET_PREFIX_SIZE 7 /* XXXXXX+ */ + /* ================ Types and structures ================ */ /* diff --git a/devices/vector/gdevpdtt.c b/devices/vector/gdevpdtt.c index c3e5574cd..e43dc3819 100644 --- a/devices/vector/gdevpdtt.c +++ b/devices/vector/gdevpdtt.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001-2022 Artifex Software, Inc. +/* Copyright (C) 2001-2023 Artifex Software, Inc. All Rights Reserved. This software is provided AS-IS with no warranty, either express or @@ -20,6 +20,7 @@ #include <stdlib.h> /* abs() */ #include "gx.h" #include "gserrors.h" +#include "gsutil.h" /* for bytes_compare */ #include "gscencs.h" #include "gscedata.h" #include "gsmatrix.h" @@ -543,6 +544,18 @@ pdf_prepare_text_drawing(gx_device_pdf *const pdev, gs_text_enum_t *pte) return 0; } +static bool +outline_list_includes(const gs_param_string_array *psa, const byte *chars, + uint size) +{ + uint i; + + for (i = 0; i < psa->size; ++i) + if (!bytes_compare(psa->data[i].data, psa->data[i].size, chars, size)) + return true; + return false; +} + int gdev_pdf_text_begin(gx_device * dev, gs_gstate * pgs, const gs_text_params_t *text, gs_font * font, @@ -557,8 +570,20 @@ gdev_pdf_text_begin(gx_device * dev, gs_gstate * pgs, int code, user_defined = 0; gs_memory_t * mem = pgs->memory; + const gs_font_name *fn = &font->font_name; + byte *chars_ptr = fn->chars; + uint size = fn->size; + + while (pdf_has_subset_prefix(chars_ptr, size)) { + /* Strip off an existing subset prefix. */ + chars_ptr += SUBSET_PREFIX_SIZE; + size -= SUBSET_PREFIX_SIZE; + } + /* should we "flatten" the font to "normal" marking operations */ - if (pdev->FlattenFonts) { + if (outline_list_includes(&pdev->params.AlwaysOutline, (const byte *)chars_ptr, size) || + (pdev->FlattenFonts && !outline_list_includes(&pdev->params.NeverOutline, (const byte *)chars_ptr, size)) + ) { font->dir->ccache.upper = 0; return gx_default_text_begin(dev, pgs, text, font, pcpath, ppte); diff --git a/devices/vector/gdevpsdf.h b/devices/vector/gdevpsdf.h index 8f5d6ad8d..00a7b4ee7 100644 --- a/devices/vector/gdevpsdf.h +++ b/devices/vector/gdevpsdf.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2001-2021 Artifex Software, Inc. +/* Copyright (C) 2001-2023 Artifex Software, Inc. All Rights Reserved. This software is provided AS-IS with no warranty, either express or @@ -159,6 +159,11 @@ typedef struct psdf_distiller_params_s { psdf_image_params MonoImage; + /* Font outlining parameters */ + + gs_param_string_array AlwaysOutline; + gs_param_string_array NeverOutline; + /* Font embedding parameters */ gs_param_string_array AlwaysEmbed; @@ -259,6 +264,8 @@ extern const stream_template s_zlibE_template; } #define psdf_font_param_defaults\ + {0}, /* AlwaysOutline (array of names) */ \ + {0}, /* NeverOutline (array of names) */ \ {0}, /* AlwaysEmbed (array of names) */ \ {0}, /* NeverEmbed (array of names) */ \ cefp_Warning, /* CannotEmbedFontPolicy */ \ @@ -336,6 +343,8 @@ extern_st(st_device_psdf); params.GrayImage.Dict),\ GC_OBJ_ELT2(gx_device_psdf, params.MonoImage.ACSDict,\ params.MonoImage.Dict),\ + GC_OBJ_ELT2(gx_device_psdf, params.AlwaysOutline.data,\ + params.NeverOutline.data),\ GC_OBJ_ELT2(gx_device_psdf, params.AlwaysEmbed.data,\ params.NeverEmbed.data),\ GC_CONST_STRING_ELT(gx_device_psdf, params.PSDocOptions)\ diff --git a/devices/vector/gdevpsdp.c b/devices/vector/gdevpsdp.c index cf6933ece..bd0016973 100644 --- a/devices/vector/gdevpsdp.c +++ b/devices/vector/gdevpsdp.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001-2022 Artifex Software, Inc. +/* Copyright (C) 2001-2023 Artifex Software, Inc. All Rights Reserved. This software is provided AS-IS with no warranty, either express or @@ -499,6 +499,12 @@ gdev_psdf_get_param(gx_device *dev, char *Param, void *list) return(psdf_write_string_param(plist, "sRGBProfile", &pdev->params.sRGBProfile)); } + if (strcmp(Param, ".AlwaysOutline") == 0) { + return(psdf_get_embed_param(plist, ".AlwaysOutline", &pdev->params.AlwaysOutline)); + } + if (strcmp(Param, ".NeverOutline") == 0) { + return(psdf_get_embed_param(plist, ".NeverOutline", &pdev->params.NeverOutline)); + } if (strcmp(Param, ".AlwaysEmbed") == 0) { return(psdf_get_embed_param(plist, ".AlwaysEmbed", &pdev->params.AlwaysEmbed)); } @@ -598,6 +604,16 @@ gdev_psdf_get_params(gx_device * dev, gs_param_list * plist) if (code < 0) return code; + /* Font outlining parameters */ + + code = psdf_get_embed_param(plist, ".AlwaysOutline", &pdev->params.AlwaysOutline); + if (code < 0) + return code; + + code = psdf_get_embed_param(plist, ".NeverOutline", &pdev->params.NeverOutline); + if (code < 0) + return code; + /* Font embedding parameters */ code = psdf_get_embed_param(plist, ".AlwaysEmbed", &pdev->params.AlwaysEmbed); @@ -1117,6 +1133,8 @@ gdev_psdf_put_params(gx_device * dev, gs_param_list * plist) params.ColorImage.ACSDict = params.ColorImage.Dict = 0; params.GrayImage.ACSDict = params.GrayImage.Dict = 0; params.MonoImage.ACSDict = params.MonoImage.Dict = 0; + params.AlwaysOutline.data = params.NeverOutline.data = NULL; + params.AlwaysOutline.size = params.NeverOutline.size = 0; params.AlwaysEmbed.data = params.NeverEmbed.data = 0; params.AlwaysEmbed.size = params.AlwaysEmbed.persistent = params.NeverEmbed.size = params.NeverEmbed.persistent = 0; params.PSPageOptions.data = NULL; @@ -1223,6 +1241,18 @@ gdev_psdf_put_params(gx_device * dev, gs_param_list * plist) goto exit; } + /* Font outlining parameters */ + + ecode = psdf_put_embed_param(plist, "~AlwaysOutline", ".AlwaysOutline", + ¶ms.AlwaysOutline, mem, ecode); + ecode = psdf_put_embed_param(plist, "~NeverOutline", ".NeverOutline", + ¶ms.NeverOutline, mem, ecode); + + if (ecode < 0) { + code = ecode; + goto exit; + } + /* Font embedding parameters */ ecode = psdf_put_embed_param(plist, "~AlwaysEmbed", ".AlwaysEmbed", |