summaryrefslogtreecommitdiff
path: root/source/fitz/colorspace.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/fitz/colorspace.c')
-rw-r--r--source/fitz/colorspace.c139
1 files changed, 78 insertions, 61 deletions
diff --git a/source/fitz/colorspace.c b/source/fitz/colorspace.c
index e7a97d04..9cc178d9 100644
--- a/source/fitz/colorspace.c
+++ b/source/fitz/colorspace.c
@@ -150,7 +150,7 @@ void fz_cmm_fin_profile(fz_context *ctx, fz_iccprofile *profile)
#ifdef NO_ICC
const unsigned char *
-fz_lookup_icc(fz_context *ctx, const char *name, size_t *size)
+fz_lookup_icc(fz_context *ctx, enum fz_colorspace_type type, size_t *size)
{
return *size = 0, NULL;
}
@@ -163,23 +163,23 @@ fz_lookup_icc(fz_context *ctx, const char *name, size_t *size)
#include "icc/lab.icc.h"
const unsigned char *
-fz_lookup_icc(fz_context *ctx, const char *name, size_t *size)
+fz_lookup_icc(fz_context *ctx, enum fz_colorspace_type type, size_t *size)
{
if (fz_get_cmm_engine(ctx) == NULL)
return *size = 0, NULL;
- if (!strcmp(name, FZ_ICC_PROFILE_GRAY)) {
+ if (type == FZ_COLORSPACE_GRAY) {
*size = resources_icc_gray_icc_len;
return resources_icc_gray_icc;
}
- if (!strcmp(name, FZ_ICC_PROFILE_RGB) || !strcmp(name, FZ_ICC_PROFILE_BGR)) {
+ if (type == FZ_COLORSPACE_RGB || type == FZ_COLORSPACE_BGR) {
*size = resources_icc_rgb_icc_len;
return resources_icc_rgb_icc;
}
- if (!strcmp(name, FZ_ICC_PROFILE_CMYK)) {
+ if (type == FZ_COLORSPACE_CMYK) {
*size = resources_icc_cmyk_icc_len;
return resources_icc_cmyk_icc;
}
- if (!strcmp(name, FZ_ICC_PROFILE_LAB)) {
+ if (type == FZ_COLORSPACE_LAB) {
*size = resources_icc_lab_icc_len;
return resources_icc_lab_icc;
}
@@ -850,11 +850,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, 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);
+ cct->gray = fz_new_icc_colorspace(ctx, FZ_COLORSPACE_GRAY, NULL);
+ cct->rgb = fz_new_icc_colorspace(ctx, FZ_COLORSPACE_RGB, NULL);
+ cct->bgr = fz_new_icc_colorspace(ctx, FZ_COLORSPACE_BGR, NULL);
+ cct->cmyk = fz_new_icc_colorspace(ctx, FZ_COLORSPACE_CMYK, NULL);
+ cct->lab = fz_new_icc_colorspace(ctx, FZ_COLORSPACE_LAB, NULL);
}
else
set_no_icc(cct);
@@ -3736,17 +3736,29 @@ clamp_default_icc(const fz_colorspace *cs, const float *src, float *dst)
dst[i] = fz_clamp(src[i], 0, 1);
}
+static const char *colorspace_name_from_type(int type)
+{
+ switch (type) {
+ default: return "Unknown";
+ case FZ_COLORSPACE_GRAY: return "Gray";
+ case FZ_COLORSPACE_RGB: return "RGB";
+ case FZ_COLORSPACE_BGR: return "BGR";
+ case FZ_COLORSPACE_CMYK: return "CMYK";
+ case FZ_COLORSPACE_LAB: return "Lab";
+ }
+}
+
fz_colorspace *
-fz_new_icc_colorspace(fz_context *ctx, const char *name, int num, fz_buffer *buf)
+fz_new_icc_colorspace(fz_context *ctx, enum fz_colorspace_type type, fz_buffer *buf)
{
#ifdef NO_ICC
fz_throw(ctx, FZ_ERROR_GENERIC, "ICC Profiles not supported in NO_ICC build");
#else
fz_colorspace *cs = NULL;
fz_iccprofile *profile;
- int is_lab = 0;
- enum fz_colorspace_type type = FZ_COLORSPACE_NONE;
int flags = FZ_COLORSPACE_IS_ICC;
+ const char *name = colorspace_name_from_type(type);
+ int num;
profile = fz_malloc_struct(ctx, fz_iccprofile);
fz_try(ctx)
@@ -3755,10 +3767,9 @@ fz_new_icc_colorspace(fz_context *ctx, const char *name, int num, fz_buffer *buf
{
size_t size;
const unsigned char *data;
- data = fz_lookup_icc(ctx, name, &size);
+ data = fz_lookup_icc(ctx, type, &size);
profile->buffer = fz_new_buffer_from_shared_data(ctx, data, size);
- is_lab = (strcmp(name, FZ_ICC_PROFILE_LAB) == 0);
- profile->bgr = (strcmp(name, FZ_ICC_PROFILE_BGR) == 0);
+ profile->bgr = (type == FZ_COLORSPACE_BGR);
flags |= FZ_COLORSPACE_IS_DEVICE;
}
else
@@ -3768,58 +3779,64 @@ fz_new_icc_colorspace(fz_context *ctx, const char *name, int num, fz_buffer *buf
fz_cmm_init_profile(ctx, profile);
- /* Check if correct type, if a particular type was expected */
- if (num != 0 && num != profile->num_devcomp)
+ if (type == FZ_COLORSPACE_NONE)
{
- fz_drop_buffer(ctx, profile->buffer);
- fz_cmm_fin_profile(ctx, profile);
- fz_free(ctx, profile);
- break;
+ switch (profile->num_devcomp)
+ {
+ default: type = FZ_COLORSPACE_SEPARATION; break;
+ case 1: type = FZ_COLORSPACE_GRAY; break;
+ case 3: type = FZ_COLORSPACE_RGB; break;
+ case 4: type = FZ_COLORSPACE_CMYK; break;
+ }
}
+ switch (type)
+ {
+ default: num = profile->num_devcomp; break;
+ case FZ_COLORSPACE_GRAY: num = 1; break;
+ case FZ_COLORSPACE_RGB: num = 3; break;
+ case FZ_COLORSPACE_BGR: num = 3; break;
+ case FZ_COLORSPACE_LAB: num = 3; break;
+ case FZ_COLORSPACE_CMYK: num = 4; break;
+ }
+
+ /* Check if correct type, if a particular type was expected */
+ if (num != profile->num_devcomp)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "ICC profile did not match expected colorspace type");
+
fz_md5_icc(ctx, profile);
- switch (profile->num_devcomp)
+ cs = fz_new_colorspace(ctx, name, type, flags, profile->num_devcomp,
+ NULL,
+ NULL,
+ NULL,
+ (type == FZ_COLORSPACE_LAB) ? clamp_lab_icc : clamp_default_icc,
+ free_icc,
+ profile, sizeof(profile));
+
+ switch (type)
{
default:
- type = FZ_COLORSPACE_SEPARATION;
- break;
- case 1:
- type = FZ_COLORSPACE_GRAY;
break;
- case 3:
- if (is_lab)
- type = FZ_COLORSPACE_LAB;
- else if (profile->bgr)
- type = FZ_COLORSPACE_BGR;
- else
- type = FZ_COLORSPACE_RGB;
+ case FZ_COLORSPACE_GRAY:
+ fz_colorspace_name_colorant(ctx, cs, 0, "Gray");
break;
- case 4:
- type = FZ_COLORSPACE_CMYK;
+ case FZ_COLORSPACE_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*");
break;
- }
-
- cs = fz_new_colorspace(ctx, name, type, flags, profile->num_devcomp, NULL, NULL, NULL, is_lab ? clamp_lab_icc : clamp_default_icc, free_icc, profile, sizeof(profile));
-
- switch (profile->num_devcomp)
- {
- case 1:
- fz_colorspace_name_colorant(ctx, cs, 0, "Gray");
+ case FZ_COLORSPACE_RGB:
+ 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 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 {
- fz_colorspace_name_colorant(ctx, cs, profile->bgr ? 2 : 0, "Red");
- fz_colorspace_name_colorant(ctx, cs, 1, "Green");
- fz_colorspace_name_colorant(ctx, cs, profile->bgr ? 0 : 2, "Blue");
- }
+ case FZ_COLORSPACE_BGR:
+ fz_colorspace_name_colorant(ctx, cs, 2, "Red");
+ fz_colorspace_name_colorant(ctx, cs, 1, "Green");
+ fz_colorspace_name_colorant(ctx, cs, 0, "Blue");
break;
- case 4:
+ case FZ_COLORSPACE_CMYK:
fz_colorspace_name_colorant(ctx, cs, 0, "Cyan");
fz_colorspace_name_colorant(ctx, cs, 1, "Magenta");
fz_colorspace_name_colorant(ctx, cs, 2, "Yellow");
@@ -3837,12 +3854,12 @@ fz_new_icc_colorspace(fz_context *ctx, const char *name, int num, fz_buffer *buf
#endif
}
-fz_colorspace *fz_new_icc_colorspace_from_file(fz_context *ctx, const char *name, const char *path)
+fz_colorspace *fz_new_icc_colorspace_from_file(fz_context *ctx, enum fz_colorspace_type type, const char *path)
{
fz_colorspace *cs = NULL;
fz_buffer *buffer = fz_read_file(ctx, path);
fz_try(ctx)
- cs = fz_new_icc_colorspace(ctx, name, 0, buffer);
+ cs = fz_new_icc_colorspace(ctx, type, buffer);
fz_always(ctx)
fz_drop_buffer(ctx, buffer);
fz_catch(ctx)
@@ -3850,12 +3867,12 @@ fz_colorspace *fz_new_icc_colorspace_from_file(fz_context *ctx, const char *name
return cs;
}
-fz_colorspace *fz_new_icc_colorspace_from_stream(fz_context *ctx, const char *name, fz_stream *in)
+fz_colorspace *fz_new_icc_colorspace_from_stream(fz_context *ctx, enum fz_colorspace_type type, fz_stream *in)
{
fz_colorspace *cs = NULL;
fz_buffer *buffer = fz_read_all(ctx, in, 1024);
fz_try(ctx)
- cs = fz_new_icc_colorspace(ctx, name, 0, buffer);
+ cs = fz_new_icc_colorspace(ctx, type, buffer);
fz_always(ctx)
fz_drop_buffer(ctx, buffer);
fz_catch(ctx)