diff options
-rw-r--r-- | include/mupdf/fitz/colorspace.h | 6 | ||||
-rw-r--r-- | source/fitz/colorspace-imp.h | 8 | ||||
-rw-r--r-- | source/fitz/colorspace.c | 45 | ||||
-rw-r--r-- | source/pdf/pdf-colorspace.c | 11 |
4 files changed, 41 insertions, 29 deletions
diff --git a/include/mupdf/fitz/colorspace.h b/include/mupdf/fitz/colorspace.h index 971f2ebe..aa0e90de 100644 --- a/include/mupdf/fitz/colorspace.h +++ b/include/mupdf/fitz/colorspace.h @@ -101,7 +101,7 @@ typedef fz_colorspace *(fz_colorspace_base_fn)(const fz_colorspace *cs); typedef void (fz_colorspace_clamp_fn)(const fz_colorspace *cs, const float *src, float *dst); -fz_colorspace *fz_new_colorspace(fz_context *ctx, char *name, int n, int is_subtractive, fz_colorspace_convert_fn *to_ccs, fz_colorspace_convert_fn *from_ccs, fz_colorspace_base_fn *base, fz_colorspace_clamp_fn *clamp, fz_colorspace_destruct_fn *destruct, void *data, size_t size); +fz_colorspace *fz_new_colorspace(fz_context *ctx, const char *name, int n, int is_subtractive, fz_colorspace_convert_fn *to_ccs, fz_colorspace_convert_fn *from_ccs, fz_colorspace_base_fn *base, fz_colorspace_clamp_fn *clamp, fz_colorspace_destruct_fn *destruct, void *data, size_t size); fz_colorspace *fz_new_indexed_colorspace(fz_context *ctx, fz_colorspace *base, int high, unsigned char *lookup); fz_colorspace *fz_keep_colorspace(fz_context *ctx, fz_colorspace *colorspace); void fz_drop_colorspace(fz_context *ctx, fz_colorspace *colorspace); @@ -154,8 +154,8 @@ struct fz_cal_colorspace_s { /* icc methods */ -fz_colorspace *fz_new_icc_colorspace(fz_context *ctx, int num, fz_buffer *buf, const char *name); -fz_colorspace *fz_new_cal_colorspace(fz_context *ctx, float *wp, float *bp, float *gamma, float *matrix); +fz_colorspace *fz_new_icc_colorspace(fz_context *ctx, const char *name, int num, fz_buffer *buf); +fz_colorspace *fz_new_cal_colorspace(fz_context *ctx, const char *name, float *wp, float *bp, float *gamma, float *matrix); fz_buffer *fz_new_icc_data_from_cal_colorspace(fz_context *ctx, fz_cal_colorspace *cal); fz_buffer *fz_icc_data_from_icc_colorspace(fz_context *ctx, const fz_colorspace *cs); diff --git a/source/fitz/colorspace-imp.h b/source/fitz/colorspace-imp.h index 9c909a4d..47688c4a 100644 --- a/source/fitz/colorspace-imp.h +++ b/source/fitz/colorspace-imp.h @@ -6,6 +6,12 @@ #include "mupdf/fitz/color-management.h" #include "mupdf/fitz/pixmap.h" +#define FZ_ICC_PROFILE_GRAY "DeviceGray-ICCBased" +#define FZ_ICC_PROFILE_RGB "DeviceRGB-ICCBased" +#define FZ_ICC_PROFILE_BGR "DeviceBGR-ICCBased" +#define FZ_ICC_PROFILE_CMYK "DeviceCMYK-ICCBased" +#define FZ_ICC_PROFILE_LAB "Lab-ICCBased" + int fz_cmm_avoid_white_fix_flag(fz_context *ctx); void fz_cmm_transform_pixmap(fz_context *ctx, fz_icclink *link, fz_pixmap *dst, fz_pixmap *src); void fz_cmm_transform_color(fz_context *ctx, fz_icclink *link, unsigned short *dst, const unsigned short *src); @@ -20,7 +26,7 @@ struct fz_colorspace_s { fz_storable storable; size_t size; - char name[16]; + char name[24]; int n; int is_subtractive; fz_colorspace_convert_fn *to_ccs; diff --git a/source/fitz/colorspace.c b/source/fitz/colorspace.c index 0a6d2b91..6f010a13 100644 --- a/source/fitz/colorspace.c +++ b/source/fitz/colorspace.c @@ -79,25 +79,25 @@ fz_lookup_icc(fz_context *ctx, const char *name, size_t *size) #ifndef NO_ICC if (fz_get_cmm_engine(ctx) == NULL) return *size = 0, NULL; - if (!strcmp(name, "gray-icc")) { + if (!strcmp(name, FZ_ICC_PROFILE_GRAY)) { extern const int fz_resources_icc_gray_icc_size; extern const unsigned char fz_resources_icc_gray_icc[]; *size = fz_resources_icc_gray_icc_size; return fz_resources_icc_gray_icc; } - if (!strcmp(name, "rgb-icc") || !strcmp(name, "bgr-icc")) { + if (!strcmp(name, FZ_ICC_PROFILE_RGB) || !strcmp(name, FZ_ICC_PROFILE_BGR)) { extern const int fz_resources_icc_rgb_icc_size; extern const unsigned char fz_resources_icc_rgb_icc[]; *size = fz_resources_icc_rgb_icc_size; return fz_resources_icc_rgb_icc; } - if (!strcmp(name, "cmyk-icc")) { + if (!strcmp(name, FZ_ICC_PROFILE_CMYK)) { extern const int fz_resources_icc_cmyk_icc_size; extern const unsigned char fz_resources_icc_cmyk_icc[]; *size = fz_resources_icc_cmyk_icc_size; return fz_resources_icc_cmyk_icc; } - if (!strcmp(name, "lab-icc")) { + if (!strcmp(name, FZ_ICC_PROFILE_LAB)) { extern const int fz_resources_icc_lab_icc_size; extern const unsigned char fz_resources_icc_lab_icc[]; *size = fz_resources_icc_lab_icc_size; @@ -154,12 +154,12 @@ clamp_default(const fz_colorspace *cs, const float *src, float *dst) } fz_colorspace * -fz_new_colorspace(fz_context *ctx, char *name, int n, int is_subtractive, fz_colorspace_convert_fn *to_ccs, fz_colorspace_convert_fn *from_ccs, fz_colorspace_base_fn *base, fz_colorspace_clamp_fn *clamp, fz_colorspace_destruct_fn *destruct, void *data, size_t size) +fz_new_colorspace(fz_context *ctx, const char *name, int n, int is_subtractive, fz_colorspace_convert_fn *to_ccs, fz_colorspace_convert_fn *from_ccs, fz_colorspace_base_fn *base, fz_colorspace_clamp_fn *clamp, fz_colorspace_destruct_fn *destruct, void *data, size_t size) { fz_colorspace *cs = fz_malloc_struct(ctx, fz_colorspace); FZ_INIT_STORABLE(cs, 1, fz_drop_colorspace_imp); cs->size = sizeof(fz_colorspace) + size; - fz_strlcpy(cs->name, name, sizeof cs->name); + fz_strlcpy(cs->name, name ? name : "UNKNOWN", sizeof cs->name); cs->n = n; cs->is_subtractive = is_subtractive; cs->to_ccs = to_ccs; @@ -726,11 +726,11 @@ void fz_set_cmm_engine(fz_context *ctx, const fz_cmm_engine *engine) fz_new_cmm_context(ctx); if (engine) { - cct->gray = fz_new_icc_colorspace(ctx, 1, NULL, "gray-icc"); - cct->rgb = fz_new_icc_colorspace(ctx, 3, NULL, "rgb-icc"); - cct->bgr = fz_new_icc_colorspace(ctx, 3, NULL, "bgr-icc"); - cct->cmyk = fz_new_icc_colorspace(ctx, 4, NULL, "cmyk-icc"); - cct->lab = fz_new_icc_colorspace(ctx, 3, NULL, "lab-icc"); + cct->gray = fz_new_icc_colorspace(ctx, FZ_ICC_PROFILE_GRAY, 1, NULL); + cct->rgb = fz_new_icc_colorspace(ctx, FZ_ICC_PROFILE_RGB, 3, NULL); + cct->bgr = fz_new_icc_colorspace(ctx, FZ_ICC_PROFILE_BGR, 3, NULL); + cct->cmyk = fz_new_icc_colorspace(ctx, FZ_ICC_PROFILE_CMYK, 4, NULL); + cct->lab = fz_new_icc_colorspace(ctx, FZ_ICC_PROFILE_LAB, 3, NULL); } else set_no_icc(cct); @@ -2935,7 +2935,7 @@ int fz_colorspace_n(fz_context *ctx, const fz_colorspace *cs) const char *fz_colorspace_name(fz_context *ctx, const fz_colorspace *cs) { - return cs ? cs->name : ""; + return cs && cs->name ? cs->name : ""; } static void @@ -2978,7 +2978,7 @@ int fz_colorspace_is_lab_icc(fz_context *ctx, const fz_colorspace *cs) } fz_colorspace * -fz_new_icc_colorspace(fz_context *ctx, int num, fz_buffer *buf, const char *name) +fz_new_icc_colorspace(fz_context *ctx, const char *name, int num, fz_buffer *buf) { fz_colorspace *cs = NULL; fz_iccprofile *profile; @@ -2987,15 +2987,18 @@ fz_new_icc_colorspace(fz_context *ctx, int num, fz_buffer *buf, const char *name profile = fz_malloc_struct(ctx, fz_iccprofile); fz_try(ctx) { - profile->buffer = buf; - if (name != NULL) + if (buf == NULL) { size_t size; const unsigned char *data; data = fz_lookup_icc(ctx, name, &size); profile->buffer = fz_new_buffer_from_shared_data(ctx, data, size); - is_lab = (strcmp(name, "lab-icc") == 0); - profile->bgr = (strcmp(name, "bgr-icc") == 0); + is_lab = (strcmp(name, FZ_ICC_PROFILE_LAB) == 0); + profile->bgr = (strcmp(name, FZ_ICC_PROFILE_BGR) == 0); + } + else + { + profile->buffer = fz_keep_buffer(ctx, buf); } fz_cmm_init_profile(ctx, profile); @@ -3003,16 +3006,14 @@ fz_new_icc_colorspace(fz_context *ctx, int num, fz_buffer *buf, const char *name /* Check if correct type */ if (num != profile->num_devcomp) { - if (name != NULL) - fz_drop_buffer(ctx, profile->buffer); + fz_drop_buffer(ctx, profile->buffer); fz_cmm_fin_profile(ctx, profile); fz_free(ctx, profile); } else { - fz_keep_buffer(ctx, buf); fz_md5_icc(ctx, profile); - cs = fz_new_colorspace(ctx, "icc", num, 0, NULL, NULL, NULL, is_lab ? clamp_lab_icc : clamp_default_icc, free_icc, profile, sizeof(profile)); + cs = fz_new_colorspace(ctx, name, num, 0, NULL, NULL, NULL, is_lab ? clamp_lab_icc : clamp_default_icc, free_icc, profile, sizeof(profile)); /* This is a bit of a handwave, but should be safe for our cases */ if (profile->num_devcomp == 4) @@ -3064,7 +3065,7 @@ int fz_colorspace_is_cal(fz_context *ctx, const fz_colorspace *cs) /* Profile created if needed during draw command. */ fz_colorspace * -fz_new_cal_colorspace(fz_context *ctx, float *wp, float *bp, float *gamma, float *matrix) +fz_new_cal_colorspace(fz_context *ctx, const char *name, float *wp, float *bp, float *gamma, float *matrix) { fz_colorspace *cs = NULL; int num = (matrix == NULL ? 1 : 3); diff --git a/source/pdf/pdf-colorspace.c b/source/pdf/pdf-colorspace.c index a200ce6b..905d2a85 100644 --- a/source/pdf/pdf-colorspace.c +++ b/source/pdf/pdf-colorspace.c @@ -58,8 +58,13 @@ load_icc_based(fz_context *ctx, pdf_obj *dict, int alt) { if (fz_get_cmm_engine(ctx)) { + const char *name; + if (n == 1) name = "ICCBased-Gray"; + else if (n == 3) name = "ICCBased-RGB"; + else if (n == 4) name = "ICCBased-CMYK"; + else name = "ICCBased"; buffer = pdf_load_stream(ctx, dict); - cs = fz_new_icc_colorspace(ctx, n, buffer, NULL); + cs = fz_new_icc_colorspace(ctx, name, n, buffer); } } fz_always(ctx) @@ -352,7 +357,7 @@ pdf_load_cal_gray(fz_context *ctx, pdf_obj *dict) } fz_catch(ctx) return fz_keep_colorspace(ctx, fz_device_gray(ctx)); - return fz_new_cal_colorspace(ctx, wp, bp, gamma, NULL); + return fz_new_cal_colorspace(ctx, "CalGray", wp, bp, gamma, NULL); } static fz_colorspace * @@ -381,7 +386,7 @@ pdf_load_cal_rgb(fz_context *ctx, pdf_obj *dict) } fz_catch(ctx) return fz_keep_colorspace(ctx, fz_device_rgb(ctx)); - return fz_new_cal_colorspace(ctx, wp, bp, gamma, matrix); + return fz_new_cal_colorspace(ctx, "CalRGB", wp, bp, gamma, matrix); } /* Parse and create colorspace from PDF object */ |