summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'base/gsicc_manage.c')
-rw-r--r--base/gsicc_manage.c47
1 files changed, 32 insertions, 15 deletions
diff --git a/base/gsicc_manage.c b/base/gsicc_manage.c
index 91be6537..08d5bf19 100644
--- a/base/gsicc_manage.c
+++ b/base/gsicc_manage.c
@@ -40,6 +40,7 @@
#include "gpmisc.h"
#include "gxdevice.h"
#include "gxdevsop.h"
+#include "assert_.h"
#define ICC_HEADER_SIZE 128
#define CREATE_V2_DATA 0
@@ -251,19 +252,17 @@ gsicc_initialize_iccsmask(gsicc_manager_t *icc_manager)
/* Load the gray, rgb, and cmyk profiles */
if ((icc_manager->smask_profiles->smask_gray =
gsicc_set_iccsmaskprofile(SMASK_GRAY_ICC, strlen(SMASK_GRAY_ICC),
- icc_manager, stable_mem) ) == NULL) {
- return gs_throw(-1, "failed to load gray smask profile");
- }
+ icc_manager, stable_mem) ) == NULL)
+ goto error;
if ((icc_manager->smask_profiles->smask_rgb =
gsicc_set_iccsmaskprofile(SMASK_RGB_ICC, strlen(SMASK_RGB_ICC),
- icc_manager, stable_mem)) == NULL) {
- return gs_throw(-1, "failed to load rgb smask profile");
- }
+ icc_manager, stable_mem)) == NULL)
+ goto error;
if ((icc_manager->smask_profiles->smask_cmyk =
gsicc_set_iccsmaskprofile(SMASK_CMYK_ICC, strlen(SMASK_CMYK_ICC),
- icc_manager, stable_mem)) == NULL) {
- return gs_throw(-1, "failed to load cmyk smask profile");
- }
+ icc_manager, stable_mem)) == NULL)
+ goto error;
+
/* Set these as "default" so that pdfwrite or other high level devices
will know that these are manufactured profiles, and default spaces
should be used */
@@ -271,6 +270,20 @@ gsicc_initialize_iccsmask(gsicc_manager_t *icc_manager)
icc_manager->smask_profiles->smask_rgb->default_match = DEFAULT_RGB;
icc_manager->smask_profiles->smask_cmyk->default_match = DEFAULT_CMYK;
return 0;
+
+error:
+ if (icc_manager->smask_profiles->smask_gray)
+ rc_free_icc_profile(stable_mem, icc_manager->smask_profiles->smask_gray, "gsicc_initialize_iccsmask");
+ icc_manager->smask_profiles->smask_gray = NULL;
+ if (icc_manager->smask_profiles->smask_rgb)
+ rc_free_icc_profile(stable_mem, icc_manager->smask_profiles->smask_rgb, "gsicc_initialize_iccsmask");
+ icc_manager->smask_profiles->smask_rgb = NULL;
+ if (icc_manager->smask_profiles->smask_cmyk)
+ rc_free_icc_profile(stable_mem, icc_manager->smask_profiles->smask_cmyk, "gsicc_initialize_iccsmask");
+ icc_manager->smask_profiles->smask_cmyk = NULL;
+ gs_free_object(stable_mem, icc_manager->smask_profiles, "gsicc_initialize_iccsmask");
+ icc_manager->smask_profiles = NULL;
+ return gs_throw(-1, "failed to load an smask profile");
}
static int
@@ -1455,6 +1468,7 @@ gsicc_new_device_profile_array(gx_device *dev)
result->pageneutralcolor = false;
result->usefastcolor = false; /* Default is to not use fast color */
result->blacktext = false;
+ result->blackvector = false;
result->prebandthreshold = true;
result->supports_devn = false;
result->overprint_control = gs_overprint_control_enable; /* Default overprint if the device can */
@@ -2358,11 +2372,12 @@ gsicc_manager_new(gs_memory_t *memory)
/* Allocated in stable gc memory. This done since the profiles
may be introduced late in the process. */
- result = gs_alloc_struct(memory->stable_memory, gsicc_manager_t, &st_gsicc_manager,
+ memory = memory->stable_memory;
+ result = gs_alloc_struct(memory, gsicc_manager_t, &st_gsicc_manager,
"gsicc_manager_new");
if ( result == NULL )
return NULL;
- rc_init_free(result, memory->stable_memory, 1, rc_gsicc_manager_free);
+ rc_init_free(result, memory, 1, rc_gsicc_manager_free);
result->default_gray = NULL;
result->default_rgb = NULL;
result->default_cmyk = NULL;
@@ -2372,14 +2387,14 @@ gsicc_manager_new(gs_memory_t *memory)
result->device_named = NULL;
result->device_n = NULL;
result->smask_profiles = NULL;
- result->memory = memory->stable_memory;
+ result->memory = memory;
result->srcgtag_profile = NULL;
result->override_internal = false;
return result;
}
static void gsicc_manager_free_contents(gsicc_manager_t *icc_manager,
- client_name_t cname)
+ client_name_t cname)
{
int k;
gsicc_devicen_entry_t *device_n, *device_n_next;
@@ -2419,6 +2434,8 @@ rc_gsicc_manager_free(gs_memory_t * mem, void *ptr_in, client_name_t cname)
and then free the structure */
gsicc_manager_t *icc_manager = (gsicc_manager_t * ) ptr_in;
+ assert(mem == icc_manager->memory);
+
gs_free_object(icc_manager->memory, icc_manager, "rc_gsicc_manager_free");
}
@@ -2466,7 +2483,7 @@ gsicc_load_profile_buffer(cmm_profile_t *profile, stream *s,
/* Allocates and loads the named color structure from the stream. */
static int
gsicc_load_namedcolor_buffer(cmm_profile_t *profile, stream *s,
- gs_memory_t *memory)
+ gs_memory_t *memory)
{
int num_bytes,profile_size;
unsigned char *buffer_ptr;
@@ -2484,7 +2501,7 @@ gsicc_load_namedcolor_buffer(cmm_profile_t *profile, stream *s,
return code;
/* Allocate the buffer, stuff with the profile */
buffer_ptr = gs_alloc_bytes(memory->non_gc_memory, profile_size,
- "gsicc_load_profile");
+ "gsicc_load_profile");
if (buffer_ptr == NULL)
return gs_throw(gs_error_VMerror, "Insufficient memory for profile buffer");
num_bytes = sfread(buffer_ptr,sizeof(unsigned char),profile_size,s);