[babl] babl-palette: improvements toward palette accuracy
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [babl] babl-palette: improvements toward palette accuracy
- Date: Thu, 17 May 2018 13:30:43 +0000 (UTC)
commit 9634604e61567cb3a38a80682477e3e26f6daaf3
Author: Øyvind Kolås <pippin gimp org>
Date: Thu May 17 14:33:07 2018 +0200
babl-palette: improvements toward palette accuracy
For working at acceptable performance with large indexed images, it is
recommended to run with BABL_TOLERANCE=0.0385 or highger set in the environment
when launching GIMP, this permits using a hashtable based optimization that
still isn't accurate enough according to babl-expectations.
Part of progress on bug 787237
babl/babl-palette.c | 68 +++++++++++++++++++++++++++++++++++++++------------
1 files changed, 52 insertions(+), 16 deletions(-)
---
diff --git a/babl/babl-palette.c b/babl/babl-palette.c
index 1cc9758..94d214d 100644
--- a/babl/babl-palette.c
+++ b/babl/babl-palette.c
@@ -28,6 +28,8 @@
#define HASH_TABLE_SIZE 1111
+//#define SHOW_PATH
+
/* A default palette, containing standard ANSI / EGA colors
*
*/
@@ -185,15 +187,25 @@ rgba_to_pal (Babl *conversion,
{
BablPalette **palptr = dst_model_data;
BablPalette *pal = *palptr;
+#ifdef SHOW_PATH
+ fprintf (stderr, "d");
+#endif
while (n--)
{
int idx;
int best_idx = 0;
double best_diff = 100000;
- double *srcf;
-
- srcf = ((double *) src);
+ double srcf[4];
+ int c;
+ for (c = 0; c < 4; c++)
+ {
+ srcf[c] = ((double *) src)[c];
+ if (srcf[c] < 0.0)
+ srcf[c] = 0.0;
+ if (srcf[c] > 1.0)
+ srcf[c] = 1.0;
+ }
for (idx = 0; idx<pal->count; idx++)
{
@@ -210,7 +222,7 @@ rgba_to_pal (Babl *conversion,
}
}
- ((double *) dst)[0] = best_idx / 255.5;
+ ((double *) dst)[0] = best_idx / 255.0;
src += sizeof (double) * 4;
dst += sizeof (double) * 1;
@@ -226,7 +238,10 @@ rgba_to_pala (Babl *conversion,
{
BablPalette **palptr = dst_model_data;
BablPalette *pal = *palptr;
-
+
+#ifdef SHOW_PATH
+ fprintf (stderr, "D");
+#endif
assert(pal);
while (n--)
{
@@ -234,10 +249,18 @@ rgba_to_pala (Babl *conversion,
int best_idx = 0;
double best_diff = 100000;
- double *srcf;
+ double srcf[4];
double alpha;
+ int c;
+ for (c = 0; c < 4; c++)
+ {
+ srcf[c] = ((double *) src)[c];
+ if (srcf[c] < 0.0)
+ srcf[c] = 0.0;
+ if (srcf[c] > 1.0)
+ srcf[c] = 1.0;
+ }
- srcf = ((double *) src);
alpha = srcf[3];
for (idx = 0; idx<pal->count; idx++)
@@ -255,7 +278,7 @@ rgba_to_pala (Babl *conversion,
}
}
- ((double *) dst)[0] = best_idx / 255.5;
+ ((double *) dst)[0] = best_idx / 255.0;
((double *) dst)[1] = alpha;
src += sizeof (double) * 4;
@@ -275,7 +298,7 @@ pal_to_rgba (Babl *conversion,
assert(pal);
while (n--)
{
- int idx = (((double *) src)[0]) * 255.5;
+ int idx = (((double *) src)[0]) * 255.0;
double *palpx;
if (idx < 0) idx = 0;
@@ -302,7 +325,7 @@ pala_to_rgba (Babl *conversion,
assert(pal);
while (n--)
{
- int idx = (((double *) src)[0]) * 255.5;
+ int idx = (((double *) src)[0]) * 255.0;
double alpha = (((double *) src)[1]);
double *palpx;
@@ -312,7 +335,7 @@ pala_to_rgba (Babl *conversion,
palpx = ((double *)pal->data_double) + idx * 4;
memcpy (dst, palpx, sizeof(double)*4);
- ((double *)dst)[3] *= alpha;
+ ((double *)dst)[3] *= alpha;
src += sizeof (double) * 2;
dst += sizeof (double) * 4;
@@ -331,6 +354,9 @@ rgba_u8_to_pal (Babl *conversion,
assert (palptr);
pal = *palptr;
assert(pal);
+#ifdef SHOW_PATH
+ fprintf (stderr, "8");
+#endif
while (n--)
{
dst[0] = babl_palette_lookup (pal, src[0], src[1], src[2], src[3]);
@@ -347,11 +373,16 @@ rgba_float_to_pal_a (Babl *conversion,
long n,
void *src_model_data)
{
+ const Babl *space = babl_conversion_get_destination_space (conversion);
BablPalette **palptr = src_model_data;
BablPalette *pal;
assert (palptr);
pal = *palptr;
assert(pal);
+
+#ifdef SHOW_PATH
+ fprintf (stderr, "f");
+#endif
while (n--)
{
float *src_f = (void*) src_b;
@@ -364,7 +395,8 @@ rgba_float_to_pal_a (Babl *conversion,
else if (src_f[c] <= 0.0f)
src[c] = 0;
else
- src[c] = src_f[c] * 255 + 0.5f;
+ src[c] = babl_trc_from_linear (space->space.trc[0],
+ src_f[c]) * 255 + 0.5f;
}
if (src_f[3] >= 1.0f)
src[3] = 255;
@@ -390,12 +422,15 @@ rgba_float_to_pal (Babl *conversion,
long n,
void *src_model_data)
{
- const Babl *space = babl_conversion_get_source_space (conversion);
+ const Babl *space = babl_conversion_get_destination_space (conversion);
BablPalette **palptr = src_model_data;
BablPalette *pal;
assert (palptr);
pal = *palptr;
assert(pal);
+#ifdef SHOW_PATH
+ fprintf (stderr, "F");
+#endif
while (n--)
{
float *src_f = (void*) src_b;
@@ -408,7 +443,8 @@ rgba_float_to_pal (Babl *conversion,
else if (src_f[c] <= 0.0f)
src[c] = 0;
else
- src[c] = src_f[c] * 255 + 0.5f;
+ src[c] = babl_trc_from_linear (space->space.trc[0],
+ src_f[c]) * 255 + 0.5f;
}
if (src_f[3] >= 1.0f)
src[3] = 255;
@@ -687,13 +723,13 @@ const Babl *babl_new_palette (const char *name,
NULL);
babl_conversion_new (
- babl_format ("R'G'B'A float"),
+ babl_format ("RGBA float"),
f_pal_a_u8,
"linear", rgba_float_to_pal_a,
"data", palptr,
NULL);
babl_conversion_new (
- babl_format ("R'G'B'A float"),
+ babl_format ("RGBA float"),
f_pal_u8,
"linear", rgba_float_to_pal,
"data", palptr,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]