From 89b91112b810a6b29396b8f4e91c8bde92969e0e Mon Sep 17 00:00:00 2001 From: Robin Watts Date: Fri, 28 Jul 2017 12:42:31 +0100 Subject: Change colorspace 'device_n' field to be a flags word. --- include/mupdf/fitz/colorspace.h | 30 ++++++++------ source/fitz/colorspace-imp.h | 10 ++++- source/fitz/colorspace.c | 87 +++++++++++++++-------------------------- source/fitz/draw-device.c | 2 +- source/pdf/pdf-colorspace.c | 2 +- 5 files changed, 61 insertions(+), 70 deletions(-) diff --git a/include/mupdf/fitz/colorspace.h b/include/mupdf/fitz/colorspace.h index e07ea538..3c393caa 100644 --- a/include/mupdf/fitz/colorspace.h +++ b/include/mupdf/fitz/colorspace.h @@ -16,14 +16,6 @@ enum FZ_RI_ABSOLUTE_COLORIMETRIC, }; -enum -{ - FZ_NOT_DEVICE_N, - FZ_DEVICE_N_SPOTS_ONLY, - FZ_DEVICE_N_WITH_CMYK, - FZ_DEVICE_N_CMYK_ONLY -}; - typedef struct fz_color_params_s fz_color_params; struct fz_color_params_s @@ -79,9 +71,10 @@ int fz_colorspace_is_subtractive(fz_context *ctx, const fz_colorspace *cs); int fz_colorspace_is_device_n(fz_context *ctx, const fz_colorspace *cs); /* - fz_colorspace_device_n: Return information about device n colorants + fz_colorspace_device_n_has_only_cmyk: Return true if devicen color space + has only colorants from the cmyk set. */ -int fz_colorspace_device_n_info(fz_context *ctx, const fz_colorspace *cs); +int fz_colorspace_device_n_has_only_cmyk(fz_context *ctx, const fz_colorspace *cs); /* fz_colorspace_device_n_has_cmyk: Return true if devicen color space has cyan @@ -89,6 +82,12 @@ int fz_colorspace_device_n_info(fz_context *ctx, const fz_colorspace *cs); */ int fz_colorspace_device_n_has_cmyk(fz_context *ctx, const fz_colorspace *cs); +/* + fz_colorspace_is_device_gray: Return true if the color space is + device gray. +*/ +int fz_colorspace_is_device_gray(fz_context *ctx, const fz_colorspace *cs); + /* fz_device_gray: Get colorspace representing device specific gray. */ @@ -127,7 +126,16 @@ 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, const char *name, int n, int is_subtractive, int is_device_n, 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); +enum +{ + FZ_CS_DEVICE_GRAY = 1, + FZ_CS_DEVICE_N = 2, + FZ_CS_SUBTRACTIVE = 4, + + FZ_CS_LAST_PUBLIC_FLAG = 4 +}; + +fz_colorspace *fz_new_colorspace(fz_context *ctx, const char *name, int n, int flags, 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); void fz_colorspace_name_colorant(fz_context *ctx, fz_colorspace *cs, int n, const char *name); const char *fz_colorspace_colorant(fz_context *ctx, const fz_colorspace *cs, int n); fz_colorspace *fz_new_indexed_colorspace(fz_context *ctx, fz_colorspace *base, int high, unsigned char *lookup); diff --git a/source/fitz/colorspace-imp.h b/source/fitz/colorspace-imp.h index 886b8bb8..c369c165 100644 --- a/source/fitz/colorspace-imp.h +++ b/source/fitz/colorspace-imp.h @@ -22,14 +22,20 @@ void fz_cmm_drop_instance(fz_context *ctx); void fz_cmm_init_profile(fz_context *ctx, fz_iccprofile *profile); void fz_cmm_fin_profile(fz_context *ctx, fz_iccprofile *profile); +enum +{ + FZ_CS_HAS_CMYK = (FZ_CS_LAST_PUBLIC_FLAG<<1), + FZ_CS_HAS_SPOTS = (FZ_CS_LAST_PUBLIC_FLAG<<2), + FZ_CS_HAS_CMYK_AND_SPOTS = FZ_CS_HAS_CMYK|FZ_CS_HAS_SPOTS +}; + struct fz_colorspace_s { fz_key_storable key_storable; size_t size; char name[24]; unsigned char n; - unsigned char is_subtractive; - unsigned char device_n; + unsigned char flags; fz_colorspace_convert_fn *to_ccs; fz_colorspace_convert_fn *from_ccs; fz_colorspace_clamp_fn *clamp; diff --git a/source/fitz/colorspace.c b/source/fitz/colorspace.c index 414ef097..ed6f768e 100644 --- a/source/fitz/colorspace.c +++ b/source/fitz/colorspace.c @@ -157,15 +157,14 @@ clamp_default(const fz_colorspace *cs, const float *src, float *dst) } fz_colorspace * -fz_new_colorspace(fz_context *ctx, const char *name, int n, int is_subtractive, int device_n, 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 flags, 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_KEY_STORABLE(cs, 1, fz_drop_colorspace_imp); cs->size = sizeof(fz_colorspace) + size; fz_strlcpy(cs->name, name ? name : "UNKNOWN", sizeof cs->name); cs->n = n; - cs->is_subtractive = is_subtractive; - cs->device_n = device_n; + cs->flags = (unsigned char)flags; cs->to_ccs = to_ccs; cs->from_ccs = from_ccs; cs->get_base = base; @@ -688,14 +687,14 @@ static int fz_colorspace_is_lab(fz_context *ctx, const fz_colorspace *cs) int fz_colorspace_is_subtractive(fz_context *ctx, const fz_colorspace *cs) { - return (cs && cs->is_subtractive); + return (cs && !!(cs->flags & FZ_CS_SUBTRACTIVE)); } -static fz_colorspace k_default_gray = { { {-1, fz_drop_colorspace_imp}, 0 },0, "DeviceGray", 1, 0, 0, gray_to_rgb, rgb_to_gray, clamp_default, NULL, NULL, NULL, { "Gray" } }; -static fz_colorspace k_default_rgb = { { {-1, fz_drop_colorspace_imp}, 0 },0, "DeviceRGB", 3, 0, 0, rgb_to_rgb, rgb_to_rgb, clamp_default, NULL, NULL, NULL, { "Red", "Green", "Blue" } }; -static fz_colorspace k_default_bgr = { { {-1, fz_drop_colorspace_imp}, 0 },0, "DeviceBGR", 3, 0, 0, bgr_to_rgb, rgb_to_bgr, clamp_default, NULL, NULL, NULL, { "Blue", "Green", "Red" } }; -static fz_colorspace k_default_cmyk = { { {-1, fz_drop_colorspace_imp}, 0 },0, "DeviceCMYK", 4, 1, 0, cmyk_to_rgb, rgb_to_cmyk, clamp_default, NULL, NULL, NULL, { "Cyan", "Magenta", "Yellow", "Black" } }; -static fz_colorspace k_default_lab = { { {-1, fz_drop_colorspace_imp}, 0 }, 0, "Lab", 3, 0, 0, lab_to_rgb, rgb_to_lab, clamp_lab, NULL, NULL, NULL, { "L*", "a*", "b*" } }; +static fz_colorspace k_default_gray = { { {-1, fz_drop_colorspace_imp}, 0 }, 0, "DeviceGray", 1, FZ_CS_DEVICE_GRAY, gray_to_rgb, rgb_to_gray, clamp_default, NULL, NULL, NULL, { "Gray" } }; +static fz_colorspace k_default_rgb = { { {-1, fz_drop_colorspace_imp}, 0 }, 0, "DeviceRGB", 3, 0, rgb_to_rgb, rgb_to_rgb, clamp_default, NULL, NULL, NULL, { "Red", "Green", "Blue" } }; +static fz_colorspace k_default_bgr = { { {-1, fz_drop_colorspace_imp}, 0 }, 0, "DeviceBGR", 3, 0, bgr_to_rgb, rgb_to_bgr, clamp_default, NULL, NULL, NULL, { "Blue", "Green", "Red" } }; +static fz_colorspace k_default_cmyk = { { {-1, fz_drop_colorspace_imp}, 0 }, 0, "DeviceCMYK", 4, FZ_CS_SUBTRACTIVE, cmyk_to_rgb, rgb_to_cmyk, clamp_default, NULL, NULL, NULL, { "Cyan", "Magenta", "Yellow", "Black" } }; +static fz_colorspace k_default_lab = { { {-1, fz_drop_colorspace_imp}, 0 }, 0, "Lab", 3, 0, lab_to_rgb, rgb_to_lab, clamp_lab, NULL, NULL, NULL, { "L*", "a*", "b*" } }; static fz_color_params k_default_color_params = { FZ_RI_RELATIVE_COLORIMETRIC, 1, 0, 0 }; static fz_colorspace *default_gray = &k_default_gray; @@ -3412,7 +3411,7 @@ fz_new_indexed_colorspace(fz_context *ctx, fz_colorspace *base, int high, unsign idx->high = high; fz_try(ctx) - cs = fz_new_colorspace(ctx, "Indexed", 1, 0, FZ_NOT_DEVICE_N, fz_colorspace_is_icc(ctx, fz_device_rgb(ctx)) ? indexed_to_alt : indexed_to_rgb, NULL, base_indexed, clamp_indexed, free_indexed, idx, sizeof(*idx) + (base->n * (idx->high + 1)) + base->size); + cs = fz_new_colorspace(ctx, "Indexed", 1, 0, fz_colorspace_is_icc(ctx, fz_device_rgb(ctx)) ? indexed_to_alt : indexed_to_rgb, NULL, base_indexed, clamp_indexed, free_indexed, idx, sizeof(*idx) + (base->n * (idx->high + 1)) + base->size); fz_catch(ctx) { fz_free(ctx, idx); @@ -3630,6 +3629,7 @@ fz_new_icc_colorspace(fz_context *ctx, const char *name, int num, fz_buffer *buf fz_colorspace *cs = NULL; fz_iccprofile *profile; int is_lab = 0; + int flags = 0; profile = fz_malloc_struct(ctx, fz_iccprofile); fz_try(ctx) @@ -3641,6 +3641,8 @@ fz_new_icc_colorspace(fz_context *ctx, const char *name, int num, fz_buffer *buf data = fz_lookup_icc(ctx, name, &size); profile->buffer = fz_new_buffer_from_shared_data(ctx, data, size); is_lab = (strcmp(name, FZ_ICC_PROFILE_LAB) == 0); + if (strcmp(name, FZ_ICC_PROFILE_GRAY) == 0) + flags = FZ_CS_DEVICE_GRAY; profile->bgr = (strcmp(name, FZ_ICC_PROFILE_BGR) == 0); } else @@ -3660,40 +3662,16 @@ fz_new_icc_colorspace(fz_context *ctx, const char *name, int num, fz_buffer *buf } fz_md5_icc(ctx, profile); - cs = fz_new_colorspace(ctx, name, num, 0, FZ_NOT_DEVICE_N, NULL, NULL, NULL, is_lab ? clamp_lab_icc : clamp_default_icc, free_icc, profile, sizeof(profile)); + if (profile->num_devcomp == 4) + flags |= FZ_CS_SUBTRACTIVE; + cs = fz_new_colorspace(ctx, name, num, flags, NULL, NULL, NULL, is_lab ? clamp_lab_icc : clamp_default_icc, free_icc, profile, sizeof(profile)); - switch(profile->num_devcomp) + if (profile->num_devcomp == 4) { - case 1: - fz_colorspace_name_colorant(ctx, cs, 0, "Gray"); - break; - case 3: - if (is_lab) - { - fz_colorspace_name_colorant(ctx, cs, 0, "L"); - fz_colorspace_name_colorant(ctx, cs, 1, "a"); - fz_colorspace_name_colorant(ctx, cs, 2, "b"); - } - else if (profile->bgr) - { - fz_colorspace_name_colorant(ctx, cs, 0, "Blue"); - fz_colorspace_name_colorant(ctx, cs, 1, "Green"); - fz_colorspace_name_colorant(ctx, cs, 2, "Red"); - } - else - { - fz_colorspace_name_colorant(ctx, cs, 0, "Red"); - fz_colorspace_name_colorant(ctx, cs, 1, "Green"); - fz_colorspace_name_colorant(ctx, cs, 2, "Blue"); - } - break; - case 4: fz_colorspace_name_colorant(ctx, cs, 0, "Cyan"); fz_colorspace_name_colorant(ctx, cs, 1, "Magenta"); fz_colorspace_name_colorant(ctx, cs, 2, "Yellow"); fz_colorspace_name_colorant(ctx, cs, 3, "Black"); - cs->is_subtractive = 1; - break; } } fz_catch(ctx) @@ -3755,7 +3733,7 @@ fz_new_cal_colorspace(fz_context *ctx, const char *name, float *wp, float *bp, f cal_data->n = num; fz_try(ctx) - cs = fz_new_colorspace(ctx, "pdf-cal", num, 0, FZ_NOT_DEVICE_N, NULL, NULL, NULL, NULL, free_cal, cal_data, sizeof(cal_data)); + cs = fz_new_colorspace(ctx, "pdf-cal", num, 0, NULL, NULL, NULL, NULL, free_cal, cal_data, sizeof(cal_data)); fz_catch(ctx) { fz_free(ctx, cal_data); @@ -3908,7 +3886,7 @@ void fz_colorspace_name_colorant(fz_context *ctx, fz_colorspace *cs, int i, cons { cs->colorant[i] = fz_strdup(ctx, name); - if (cs->device_n != FZ_NOT_DEVICE_N) + if (cs->flags & FZ_CS_DEVICE_N) { if (i == 0) { @@ -3917,26 +3895,20 @@ void fz_colorspace_name_colorant(fz_context *ctx, fz_colorspace *cs, int i, cons strcmp(name, "Yellow") == 0 || strcmp(name, "Black") == 0) { - cs->device_n = FZ_DEVICE_N_CMYK_ONLY; + cs->flags |= FZ_CS_HAS_CMYK; } } else { - if (cs->device_n != FZ_DEVICE_N_WITH_CMYK) + if ((cs->flags & FZ_CS_HAS_CMYK_AND_SPOTS) != FZ_CS_HAS_CMYK_AND_SPOTS) { if (strcmp(name, "Cyan") == 0 || strcmp(name, "Magenta") == 0 || strcmp(name, "Yellow") == 0 || strcmp(name, "Black") == 0) - { - if (cs->device_n == FZ_DEVICE_N_SPOTS_ONLY) - cs->device_n = FZ_DEVICE_N_WITH_CMYK; - } + cs->flags |= FZ_CS_HAS_CMYK; else - { - if (cs->device_n == FZ_DEVICE_N_CMYK_ONLY) - cs->device_n = FZ_DEVICE_N_WITH_CMYK; - } + cs->flags |= FZ_CS_HAS_SPOTS; } } } @@ -3953,15 +3925,20 @@ const char *fz_colorspace_colorant(fz_context *ctx, const fz_colorspace *cs, int int fz_colorspace_is_device_n(fz_context *ctx, const fz_colorspace *cs) { - return (cs && cs->device_n != FZ_NOT_DEVICE_N); + return (cs && !!(cs->flags & FZ_CS_DEVICE_N)); } -int fz_colorspace_device_n_info(fz_context *ctx, const fz_colorspace *cs) +int fz_colorspace_device_n_has_only_cmyk(fz_context *ctx, const fz_colorspace *cs) { - return (cs == NULL ? 0 : cs->device_n); + return (cs == NULL ? 0 : ((cs->flags & FZ_CS_HAS_CMYK_AND_SPOTS) == FZ_CS_HAS_CMYK)); } int fz_colorspace_device_n_has_cmyk(fz_context *ctx, const fz_colorspace *cs) { - return (cs == NULL ? 0 : cs->device_n == FZ_DEVICE_N_WITH_CMYK || cs->device_n == FZ_DEVICE_N_CMYK_ONLY); -} \ No newline at end of file + return (cs == NULL ? 0 : !!(cs->flags & FZ_CS_HAS_CMYK)); +} + +int fz_colorspace_is_device_gray(fz_context *ctx, const fz_colorspace *cs) +{ + return (cs == NULL ? 0 : !!(cs->flags & FZ_CS_DEVICE_GRAY)); +} diff --git a/source/fitz/draw-device.c b/source/fitz/draw-device.c index 7a47e707..d8f5c911 100644 --- a/source/fitz/draw-device.c +++ b/source/fitz/draw-device.c @@ -342,7 +342,7 @@ colors_supported(fz_context *ctx, fz_colorspace *cs, fz_pixmap *dest) /* If our destination is CMYK and the source color space is only C, M, Y or K we support it * even if we have no seps */ - if (fz_colorspace_is_subtractive(ctx, dest->colorspace) && fz_colorspace_device_n_info(ctx, cs) == FZ_DEVICE_N_CMYK_ONLY) + if (fz_colorspace_is_subtractive(ctx, dest->colorspace) && fz_colorspace_device_n_has_only_cmyk(ctx, cs)) return 1; return 0; diff --git a/source/pdf/pdf-colorspace.c b/source/pdf/pdf-colorspace.c index 8dec434e..44105f7b 100644 --- a/source/pdf/pdf-colorspace.c +++ b/source/pdf/pdf-colorspace.c @@ -204,7 +204,7 @@ load_devicen(fz_context *ctx, pdf_obj *array) devn->base = fz_keep_colorspace(ctx, base); /* We drop it during the devn free... */ devn->tint = tint; - cs = fz_new_colorspace(ctx, colorspace_name, n, 1, FZ_DEVICE_N_SPOTS_ONLY, + cs = fz_new_colorspace(ctx, colorspace_name, n, FZ_CS_SUBTRACTIVE | FZ_CS_DEVICE_N, fz_colorspace_is_icc(ctx, fz_device_rgb(ctx)) ? devicen_to_alt : devicen_to_rgb, NULL, base_devicen, NULL, free_devicen, devn, sizeof(struct devicen) + base->size + pdf_function_size(ctx, tint)); -- cgit v1.2.3