diff options
Diffstat (limited to 'base/gsicc_manage.c')
-rw-r--r-- | base/gsicc_manage.c | 47 |
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); |