summaryrefslogtreecommitdiff
path: root/pixman/pixman-bits-image.c
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2012-08-18 13:22:15 -0400
committerSøren Sandmann Pedersen <ssp@redhat.com>2012-10-01 12:56:09 -0400
commite75bacc5f9196c3980ce331c7d53de5b7e92d699 (patch)
tree0eeac9a17139c3f3dbac7cbb9c8cb79ddf55dc21 /pixman/pixman-bits-image.c
parent23252393a2dcae4dc5a7d03727dd66cdd81286ba (diff)
downloadpixman-e75bacc5f9196c3980ce331c7d53de5b7e92d699.tar.gz
pixman-access.c: Add floating point accessor functions
Three new function pointer fields are added to bits_image_t: fetch_scanline_float fetch_pixel_float store_scanline_float similar to the existing 32 and 64 bit accessors. The fetcher_info_t struct in pixman_access similarly gets a new get_scanline_float field. For most formats, the new get_scanline_float field is set to a new function fetch_scanline_generic_float() that first calls the 32 bit fetcher uses the 32 bit scanline fetcher and then expands these pixels to floating point. For the 10 bpc formats, new floating point accessors are added that use pixman_unorm_to_float() and pixman_float_to_unorm() to convert back and forth. The PIXMAN_a8r8g8b8_sRGB format is handled with a 256-entry table that maps 8 bit sRGB channels to linear single precision floating point numbers. The sRGB->linear direction can then be done with a simple table lookup. The other direction is currently done with 4096-entry table which works fine for 16 bit integers, but not so great for floating point. So instead this patch uses a binary search in the sRGB->linear table. The existing 32 bit accessors for the sRGB format are also converted to use this method.
Diffstat (limited to 'pixman/pixman-bits-image.c')
-rw-r--r--pixman/pixman-bits-image.c40
1 files changed, 33 insertions, 7 deletions
diff --git a/pixman/pixman-bits-image.c b/pixman/pixman-bits-image.c
index c69e151..07353dc 100644
--- a/pixman/pixman-bits-image.c
+++ b/pixman/pixman-bits-image.c
@@ -36,6 +36,20 @@
#include "pixman-combine32.h"
#include "pixman-inlines.h"
+static uint32_t *
+_pixman_image_get_scanline_generic_float (pixman_iter_t * iter,
+ const uint32_t *mask)
+{
+ pixman_iter_get_scanline_t fetch_32 = iter->data;
+ uint32_t *buffer = iter->buffer;
+
+ fetch_32 (iter, NULL);
+
+ pixman_expand_to_float ((argb_t *)buffer, buffer, PIXMAN_a8r8g8b8, iter->width);
+
+ return iter->buffer;
+}
+
/*
* By default, just evaluate the image at 32bpp and expand. Individual image
* types can plug in a better scanline getter if they want to. For example
@@ -1129,6 +1143,7 @@ typedef struct
uint32_t flags;
pixman_iter_get_scanline_t get_scanline_32;
pixman_iter_get_scanline_t get_scanline_64;
+ pixman_iter_get_scanline_t get_scanline_float;
} fetcher_info_t;
static const fetcher_info_t fetcher_info[] =
@@ -1140,7 +1155,8 @@ static const fetcher_info_t fetcher_info[] =
FAST_PATH_NO_PAD_REPEAT |
FAST_PATH_NO_REFLECT_REPEAT),
bits_image_fetch_untransformed_32,
- bits_image_fetch_untransformed_64
+ bits_image_fetch_untransformed_64,
+ _pixman_image_get_scanline_generic_float
},
#define FAST_BILINEAR_FLAGS \
@@ -1156,13 +1172,15 @@ static const fetcher_info_t fetcher_info[] =
{ PIXMAN_a8r8g8b8,
FAST_BILINEAR_FLAGS,
bits_image_fetch_bilinear_no_repeat_8888,
- _pixman_image_get_scanline_generic_64
+ _pixman_image_get_scanline_generic_64,
+ _pixman_image_get_scanline_generic_float
},
{ PIXMAN_x8r8g8b8,
FAST_BILINEAR_FLAGS,
bits_image_fetch_bilinear_no_repeat_8888,
- _pixman_image_get_scanline_generic_64
+ _pixman_image_get_scanline_generic_64,
+ _pixman_image_get_scanline_generic_float
},
#define GENERAL_BILINEAR_FLAGS \
@@ -1183,14 +1201,16 @@ static const fetcher_info_t fetcher_info[] =
{ PIXMAN_ ## format, \
GENERAL_BILINEAR_FLAGS | FAST_PATH_ ## repeat ## _REPEAT, \
bits_image_fetch_bilinear_affine_ ## name, \
- _pixman_image_get_scanline_generic_64 \
+ _pixman_image_get_scanline_generic_64, \
+ _pixman_image_get_scanline_generic_float \
},
#define NEAREST_AFFINE_FAST_PATH(name, format, repeat) \
{ PIXMAN_ ## format, \
GENERAL_NEAREST_FLAGS | FAST_PATH_ ## repeat ## _REPEAT, \
bits_image_fetch_nearest_affine_ ## name, \
- _pixman_image_get_scanline_generic_64 \
+ _pixman_image_get_scanline_generic_64, \
+ _pixman_image_get_scanline_generic_float \
},
#define AFFINE_FAST_PATHS(name, format, repeat) \
@@ -1218,11 +1238,17 @@ static const fetcher_info_t fetcher_info[] =
{ PIXMAN_any,
(FAST_PATH_NO_ALPHA_MAP | FAST_PATH_HAS_TRANSFORM | FAST_PATH_AFFINE_TRANSFORM),
bits_image_fetch_affine_no_alpha,
- _pixman_image_get_scanline_generic_64
+ _pixman_image_get_scanline_generic_64,
+ _pixman_image_get_scanline_generic_float
},
/* General */
- { PIXMAN_any, 0, bits_image_fetch_general, _pixman_image_get_scanline_generic_64 },
+ { PIXMAN_any,
+ 0,
+ bits_image_fetch_general,
+ _pixman_image_get_scanline_generic_64,
+ _pixman_image_get_scanline_generic_float
+ },
{ PIXMAN_null },
};