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.c99
1 files changed, 43 insertions, 56 deletions
diff --git a/source/fitz/colorspace.c b/source/fitz/colorspace.c
index 8b8f3f96..d145be27 100644
--- a/source/fitz/colorspace.c
+++ b/source/fitz/colorspace.c
@@ -3,7 +3,7 @@
#define SLOWCMYK
void
-fz_free_colorspace_imp(fz_context *ctx, fz_storable *cs_)
+fz_drop_colorspace_imp(fz_context *ctx, fz_storable *cs_)
{
fz_colorspace *cs = (fz_colorspace *)cs_;
@@ -15,8 +15,8 @@ fz_free_colorspace_imp(fz_context *ctx, fz_storable *cs_)
fz_colorspace *
fz_new_colorspace(fz_context *ctx, char *name, int n)
{
- fz_colorspace *cs = fz_malloc(ctx, sizeof(fz_colorspace));
- FZ_INIT_STORABLE(cs, 1, fz_free_colorspace_imp);
+ fz_colorspace *cs = fz_malloc_struct(ctx, fz_colorspace);
+ FZ_INIT_STORABLE(cs, 1, fz_drop_colorspace_imp);
cs->size = sizeof(fz_colorspace);
fz_strlcpy(cs->name, name, sizeof cs->name);
cs->n = n;
@@ -169,10 +169,10 @@ static void rgb_to_cmyk(fz_context *ctx, fz_colorspace *cs, const float *rgb, fl
cmyk[3] = k;
}
-static fz_colorspace k_default_gray = { {-1, fz_free_colorspace_imp}, 0, "DeviceGray", 1, gray_to_rgb, rgb_to_gray };
-static fz_colorspace k_default_rgb = { {-1, fz_free_colorspace_imp}, 0, "DeviceRGB", 3, rgb_to_rgb, rgb_to_rgb };
-static fz_colorspace k_default_bgr = { {-1, fz_free_colorspace_imp}, 0, "DeviceBGR", 3, bgr_to_rgb, rgb_to_bgr };
-static fz_colorspace k_default_cmyk = { {-1, fz_free_colorspace_imp}, 0, "DeviceCMYK", 4, cmyk_to_rgb, rgb_to_cmyk };
+static fz_colorspace k_default_gray = { {-1, fz_drop_colorspace_imp}, 0, "DeviceGray", 1, gray_to_rgb, rgb_to_gray };
+static fz_colorspace k_default_rgb = { {-1, fz_drop_colorspace_imp}, 0, "DeviceRGB", 3, rgb_to_rgb, rgb_to_rgb };
+static fz_colorspace k_default_bgr = { {-1, fz_drop_colorspace_imp}, 0, "DeviceBGR", 3, bgr_to_rgb, rgb_to_bgr };
+static fz_colorspace k_default_cmyk = { {-1, fz_drop_colorspace_imp}, 0, "DeviceCMYK", 4, cmyk_to_rgb, rgb_to_cmyk };
static fz_colorspace *fz_default_gray = &k_default_gray;
static fz_colorspace *fz_default_rgb = &k_default_rgb;
@@ -198,23 +198,16 @@ void fz_new_colorspace_context(fz_context *ctx)
fz_colorspace_context *
fz_keep_colorspace_context(fz_context *ctx)
{
- if (!ctx || !ctx->colorspace)
+ if (!ctx)
return NULL;
- fz_lock(ctx, FZ_LOCK_ALLOC);
- ctx->colorspace->ctx_refs++;
- fz_unlock(ctx, FZ_LOCK_ALLOC);
- return ctx->colorspace;
+ return fz_keep_imp(ctx, ctx->colorspace, &ctx->colorspace->ctx_refs);
}
void fz_drop_colorspace_context(fz_context *ctx)
{
- int drop;
- if (!ctx || !ctx->colorspace)
+ if (!ctx)
return;
- fz_lock(ctx, FZ_LOCK_ALLOC);
- drop = --ctx->colorspace->ctx_refs;
- fz_unlock(ctx, FZ_LOCK_ALLOC);
- if (drop == 0)
+ if (fz_drop_imp(ctx, ctx->colorspace, &ctx->colorspace->ctx_refs))
fz_free(ctx, ctx->colorspace);
}
@@ -286,7 +279,7 @@ fz_set_device_cmyk(fz_context *ctx, fz_colorspace *cs)
}
int
-fz_colorspace_is_indexed(fz_colorspace *cs)
+fz_colorspace_is_indexed(fz_context *ctx, fz_colorspace *cs)
{
return (cs && !strcmp(cs->name, "Indexed"));
}
@@ -840,14 +833,14 @@ fz_std_conv_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src)
{
fz_color_converter cc;
- fz_lookup_color_converter(&cc, ctx, ds, ss);
+ fz_lookup_color_converter(ctx, &cc, ds, ss);
for (; xy > 0; xy--)
{
srcv[0] = *s++ / 255.0f * 100;
srcv[1] = *s++ - 128;
srcv[2] = *s++ - 128;
- cc.convert(&cc, dstv, srcv);
+ cc.convert(ctx, &cc, dstv, srcv);
for (k = 0; k < dstn; k++)
*d++ = dstv[k] * 255;
@@ -861,13 +854,13 @@ fz_std_conv_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src)
{
fz_color_converter cc;
- fz_lookup_color_converter(&cc, ctx, ds, ss);
+ fz_lookup_color_converter(ctx, &cc, ds, ss);
for (; xy > 0; xy--)
{
for (k = 0; k < srcn; k++)
srcv[k] = *s++ / 255.0f;
- cc.convert(&cc, dstv, srcv);
+ cc.convert(ctx, &cc, dstv, srcv);
for (k = 0; k < dstn; k++)
*d++ = dstv[k] * 255;
@@ -882,11 +875,11 @@ fz_std_conv_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src)
unsigned char lookup[FZ_MAX_COLORS * 256];
fz_color_converter cc;
- fz_lookup_color_converter(&cc, ctx, ds, ss);
+ fz_lookup_color_converter(ctx, &cc, ds, ss);
for (i = 0; i < 256; i++)
{
srcv[0] = i / 255.0f;
- cc.convert(&cc, dstv, srcv);
+ cc.convert(ctx, &cc, dstv, srcv);
for (k = 0; k < dstn; k++)
lookup[i * dstn + k] = dstv[k] * 255;
}
@@ -909,7 +902,7 @@ fz_std_conv_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src)
unsigned char *sold = &dummy;
fz_color_converter cc;
- fz_lookup_color_converter(&cc, ctx, ds, ss);
+ fz_lookup_color_converter(ctx, &cc, ds, ss);
lookup = fz_new_hash_table(ctx, 509, srcn, -1);
for (; xy > 0; xy--)
@@ -937,7 +930,7 @@ fz_std_conv_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src)
{
for (k = 0; k < srcn; k++)
srcv[k] = *s++ / 255.0f;
- cc.convert(&cc, dstv, srcv);
+ cc.convert(ctx, &cc, dstv, srcv);
for (k = 0; k < dstn; k++)
*d++ = dstv[k] * 255;
@@ -948,7 +941,7 @@ fz_std_conv_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src)
}
}
- fz_free_hash(ctx, lookup);
+ fz_drop_hash(ctx, lookup);
}
}
@@ -1000,13 +993,12 @@ fz_convert_pixmap(fz_context *ctx, fz_pixmap *dp, fz_pixmap *sp)
/* Convert a single color */
static void
-std_conv_color(fz_color_converter *cc, float *dstv, const float *srcv)
+std_conv_color(fz_context *ctx, fz_color_converter *cc, float *dstv, const float *srcv)
{
float rgb[3];
int i;
fz_colorspace *srcs = cc->ss;
fz_colorspace *dsts = cc->ds;
- fz_context *ctx = cc->ctx;
if (srcs != dsts)
{
@@ -1024,7 +1016,7 @@ std_conv_color(fz_color_converter *cc, float *dstv, const float *srcv)
}
static void
-g2rgb(fz_color_converter *cc, float *dv, const float *sv)
+g2rgb(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
dv[0] = sv[0];
dv[1] = sv[0];
@@ -1032,7 +1024,7 @@ g2rgb(fz_color_converter *cc, float *dv, const float *sv)
}
static void
-g2cmyk(fz_color_converter *cc, float *dv, const float *sv)
+g2cmyk(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
dv[0] = 0;
dv[1] = 0;
@@ -1041,13 +1033,13 @@ g2cmyk(fz_color_converter *cc, float *dv, const float *sv)
}
static void
-rgb2g(fz_color_converter *cc, float *dv, const float *sv)
+rgb2g(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
dv[0] = sv[0] * 0.3f + sv[1] * 0.59f + sv[2] * 0.11f;
}
static void
-rgb2bgr(fz_color_converter *cc, float *dv, const float *sv)
+rgb2bgr(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
dv[0] = sv[2];
dv[1] = sv[1];
@@ -1055,7 +1047,7 @@ rgb2bgr(fz_color_converter *cc, float *dv, const float *sv)
}
static void
-rgb2cmyk(fz_color_converter *cc, float *dv, const float *sv)
+rgb2cmyk(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
float c = 1 - sv[0];
float m = 1 - sv[1];
@@ -1068,13 +1060,13 @@ rgb2cmyk(fz_color_converter *cc, float *dv, const float *sv)
}
static void
-bgr2g(fz_color_converter *cc, float *dv, const float *sv)
+bgr2g(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
dv[0] = sv[0] * 0.11f + sv[1] * 0.59f + sv[2] * 0.3f;
}
static void
-bgr2cmyk(fz_color_converter *cc, float *dv, const float *sv)
+bgr2cmyk(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
float c = 1 - sv[2];
float m = 1 - sv[1];
@@ -1087,7 +1079,7 @@ bgr2cmyk(fz_color_converter *cc, float *dv, const float *sv)
}
static void
-cmyk2g(fz_color_converter *cc, float *dv, const float *sv)
+cmyk2g(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
float c = sv[0] * 0.3f;
float m = sv[1] * 0.59f;
@@ -1096,10 +1088,10 @@ cmyk2g(fz_color_converter *cc, float *dv, const float *sv)
}
static void
-cmyk2rgb(fz_color_converter *cc, float *dv, const float *sv)
+cmyk2rgb(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
#ifdef SLOWCMYK
- cmyk_to_rgb(cc->ctx, NULL, sv, dv);
+ cmyk_to_rgb(ctx, NULL, sv, dv);
#else
dv[0] = 1 - fz_min(sv[0] + sv[3], 1);
dv[1] = 1 - fz_min(sv[1] + sv[3], 1);
@@ -1108,11 +1100,11 @@ cmyk2rgb(fz_color_converter *cc, float *dv, const float *sv)
}
static void
-cmyk2bgr(fz_color_converter *cc, float *dv, const float *sv)
+cmyk2bgr(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
#ifdef SLOWCMYK
float rgb[3];
- cmyk_to_rgb(cc->ctx, NULL, sv, rgb);
+ cmyk_to_rgb(ctx, NULL, sv, rgb);
dv[0] = rgb[2];
dv[1] = rgb[1];
dv[2] = rgb[0];
@@ -1123,9 +1115,8 @@ cmyk2bgr(fz_color_converter *cc, float *dv, const float *sv)
#endif
}
-void fz_lookup_color_converter(fz_color_converter *cc, fz_context *ctx, fz_colorspace *ds, fz_colorspace *ss)
+void fz_lookup_color_converter(fz_context *ctx, fz_color_converter *cc, fz_colorspace *ds, fz_colorspace *ss)
{
- cc->ctx = ctx;
cc->ds = ds;
cc->ss = ss;
if (ss == fz_default_gray)
@@ -1182,8 +1173,8 @@ void
fz_convert_color(fz_context *ctx, fz_colorspace *ds, float *dv, fz_colorspace *ss, const float *sv)
{
fz_color_converter cc;
- fz_lookup_color_converter(&cc, ctx, ds, ss);
- cc.convert(&cc, dv, sv);
+ fz_lookup_color_converter(ctx, &cc, ds, ss);
+ cc.convert(ctx, &cc, dv, sv);
}
/* Indexed */
@@ -1293,10 +1284,9 @@ typedef struct fz_cached_color_converter
}
fz_cached_color_converter;
-static void fz_cached_color_convert(fz_color_converter *cc_, float *ds, const float *ss)
+static void fz_cached_color_convert(fz_context *ctx, fz_color_converter *cc_, float *ds, const float *ss)
{
fz_cached_color_converter *cc = cc_->opaque;
- fz_context *ctx = cc->base.ctx;
void *val = fz_hash_find(ctx, cc->hash, ss);
int n = cc->base.ds->n * sizeof(float);
fz_color_converter *base_cc = &cc->base;
@@ -1307,7 +1297,7 @@ static void fz_cached_color_convert(fz_color_converter *cc_, float *ds, const fl
return;
}
- base_cc->convert(base_cc, ds, ss);
+ base_cc->convert(ctx, base_cc, ds, ss);
val = fz_malloc(ctx, n);
memcpy(val, ds, n);
fz_try(ctx)
@@ -1327,25 +1317,23 @@ void fz_init_cached_color_converter(fz_context *ctx, fz_color_converter *cc, fz_
fz_try(ctx)
{
- fz_lookup_color_converter(&cached->base, ctx, ds, ss);
+ fz_lookup_color_converter(ctx, &cached->base, ds, ss);
cached->hash = fz_new_hash_table(ctx, 256, n * sizeof(float), -1);
cc->convert = fz_cached_color_convert;
- cc->ctx = ctx;
cc->ds = ds;
cc->ss = ss;
cc->opaque = cached;
}
fz_catch(ctx)
{
- fz_free_hash(ctx, cached->hash);
+ fz_drop_hash(ctx, cached->hash);
fz_rethrow(ctx);
}
}
-void fz_fin_cached_color_converter(fz_color_converter *cc_)
+void fz_fin_cached_color_converter(fz_context *ctx, fz_color_converter *cc_)
{
fz_cached_color_converter *cc;
- fz_context *ctx;
int i, n;
if (cc_ == NULL)
@@ -1354,7 +1342,6 @@ void fz_fin_cached_color_converter(fz_color_converter *cc_)
if (cc == NULL)
return;
cc_->opaque = NULL;
- ctx = cc_->ctx;
n = fz_hash_len(ctx, cc->hash);
for (i = 0; i < n; i++)
@@ -1363,6 +1350,6 @@ void fz_fin_cached_color_converter(fz_color_converter *cc_)
if (v)
fz_free(ctx, v);
}
- fz_free_hash(ctx, cc->hash);
+ fz_drop_hash(ctx, cc->hash);
fz_free(ctx, cc);
}