gdk: add direct gray format converters
This commit is contained in:
parent
ca4d48d2a2
commit
5212f7ef37
1 changed files with 174 additions and 50 deletions
224
gdk/gdkrgb.c
224
gdk/gdkrgb.c
|
|
@ -3542,50 +3542,145 @@ gdk_rgb_gray_to_stage (guchar *stage,
|
||||||
|
|
||||||
/* Generic gray conversion function - convert to 24bit packed, then go
|
/* Generic gray conversion function - convert to 24bit packed, then go
|
||||||
from there. */
|
from there. */
|
||||||
static void
|
#define DEFINE_GDK_RGB_GRAY_DIRECT(name, qtype, pixel_bytes, setup, store) \
|
||||||
gdk_rgb_convert_gray_0888_native (GdkRgbInfo *image_info, GdkImage *image,
|
static void \
|
||||||
gint x0, gint y0, gint width, gint height,
|
name (GdkRgbInfo *image_info, \
|
||||||
const guchar *buf, gint rowstride,
|
GdkImage *image, \
|
||||||
gint x_align, gint y_align, GdkRgbCmap *cmap)
|
gint x0, \
|
||||||
{
|
gint y0, \
|
||||||
gint y, w;
|
gint width, \
|
||||||
gint bpl = image->bpl;
|
gint height, \
|
||||||
guchar *obuf = ((guchar *) image->mem) + y0 * bpl + x0 * 4;
|
const guchar *buf, \
|
||||||
|
gint rowstride, \
|
||||||
for (y = 0; y < height; y++)
|
gint x_align, \
|
||||||
{
|
gint y_align, \
|
||||||
const guchar *p = buf;
|
GdkRgbCmap *cmap) \
|
||||||
guchar *q = obuf;
|
{ \
|
||||||
|
const guchar *src = buf; \
|
||||||
w = width;
|
guchar *dst = ((guchar *) image->mem) + \
|
||||||
while (w--)
|
y0 * image->bpl + x0 * (pixel_bytes); \
|
||||||
{
|
gint x, y; \
|
||||||
guchar g = *p++;
|
\
|
||||||
|
setup \
|
||||||
/*
|
\
|
||||||
* Store bytes explicitly here. Word-store performance varies by
|
(void) x_align; \
|
||||||
* microarchitecture even within one ISA, so keep this generic path
|
(void) y_align; \
|
||||||
* free of CPU-specific runtime dispatch.
|
(void) cmap; \
|
||||||
*/
|
\
|
||||||
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
for (y = 0; y < height; y++) \
|
||||||
q[0] = g;
|
{ \
|
||||||
q[1] = g;
|
const guchar *p = src; \
|
||||||
q[2] = g;
|
qtype *q = (qtype *) dst; \
|
||||||
q[3] = 0xff;
|
\
|
||||||
#else
|
for (x = 0; x < width; x++) \
|
||||||
q[0] = 0xff;
|
{ \
|
||||||
q[1] = g;
|
guint32 g = *p++; \
|
||||||
q[2] = g;
|
store \
|
||||||
q[3] = g;
|
} \
|
||||||
#endif
|
\
|
||||||
q += 4;
|
src += rowstride; \
|
||||||
}
|
dst += image->bpl; \
|
||||||
|
} \
|
||||||
buf += rowstride;
|
|
||||||
obuf += bpl;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFINE_GDK_RGB_GRAY_DIRECT (
|
||||||
|
gdk_rgb_convert_gray_555_br,
|
||||||
|
guint16,
|
||||||
|
2,
|
||||||
|
(void) image_info;,
|
||||||
|
guint16 pixel =
|
||||||
|
((g & 0xf8) << 7) |
|
||||||
|
((g & 0xf8) << 2) |
|
||||||
|
(g >> 3);
|
||||||
|
*q++ = (guint16) ((pixel << 8) | (pixel >> 8));)
|
||||||
|
|
||||||
|
DEFINE_GDK_RGB_GRAY_DIRECT (
|
||||||
|
gdk_rgb_convert_gray_565_br,
|
||||||
|
guint16,
|
||||||
|
2,
|
||||||
|
(void) image_info;,
|
||||||
|
guint16 pixel =
|
||||||
|
((g & 0xf8) << 8) |
|
||||||
|
((g & 0xfc) << 3) |
|
||||||
|
(g >> 3);
|
||||||
|
*q++ = (guint16) ((pixel << 8) | (pixel >> 8));)
|
||||||
|
|
||||||
|
DEFINE_GDK_RGB_GRAY_DIRECT (
|
||||||
|
gdk_rgb_convert_gray_888,
|
||||||
|
guchar,
|
||||||
|
3,
|
||||||
|
(void) image_info;,
|
||||||
|
q[0] = g;
|
||||||
|
q[1] = g;
|
||||||
|
q[2] = g;
|
||||||
|
q += 3;)
|
||||||
|
|
||||||
|
DEFINE_GDK_RGB_GRAY_DIRECT (
|
||||||
|
gdk_rgb_convert_gray_0888,
|
||||||
|
guchar,
|
||||||
|
4,
|
||||||
|
(void) image_info;,
|
||||||
|
q[0] = g;
|
||||||
|
q[1] = g;
|
||||||
|
q[2] = g;
|
||||||
|
q[3] = 0xff;
|
||||||
|
q += 4;)
|
||||||
|
|
||||||
|
DEFINE_GDK_RGB_GRAY_DIRECT (
|
||||||
|
gdk_rgb_convert_gray_0888_br,
|
||||||
|
guchar,
|
||||||
|
4,
|
||||||
|
(void) image_info;,
|
||||||
|
q[0] = 0xff;
|
||||||
|
q[1] = g;
|
||||||
|
q[2] = g;
|
||||||
|
q[3] = g;
|
||||||
|
q += 4;)
|
||||||
|
|
||||||
|
DEFINE_GDK_RGB_GRAY_DIRECT (
|
||||||
|
gdk_rgb_convert_gray_8880_br,
|
||||||
|
guint32,
|
||||||
|
4,
|
||||||
|
(void) image_info;,
|
||||||
|
*q++ =
|
||||||
|
(g << 16) |
|
||||||
|
(g << 8) |
|
||||||
|
g;)
|
||||||
|
|
||||||
|
DEFINE_GDK_RGB_GRAY_DIRECT (
|
||||||
|
gdk_rgb_convert_gray_101010_lsb,
|
||||||
|
guint32,
|
||||||
|
4,
|
||||||
|
guint32 alpha_mask =
|
||||||
|
image_info->visual->depth == 32
|
||||||
|
? 0xc0000000U
|
||||||
|
: 0;,
|
||||||
|
guint32 g10 =
|
||||||
|
(g << 2) | (g >> 6);
|
||||||
|
*q++ = GUINT32_TO_LE (
|
||||||
|
alpha_mask |
|
||||||
|
(g10 << 20) |
|
||||||
|
(g10 << 10) |
|
||||||
|
g10);)
|
||||||
|
|
||||||
|
DEFINE_GDK_RGB_GRAY_DIRECT (
|
||||||
|
gdk_rgb_convert_gray_101010_msb,
|
||||||
|
guint32,
|
||||||
|
4,
|
||||||
|
guint32 alpha_mask =
|
||||||
|
image_info->visual->depth == 32
|
||||||
|
? 0xc0000000U
|
||||||
|
: 0;,
|
||||||
|
guint32 g10 =
|
||||||
|
(g << 2) | (g >> 6);
|
||||||
|
*q++ = GUINT32_TO_BE (
|
||||||
|
alpha_mask |
|
||||||
|
(g10 << 20) |
|
||||||
|
(g10 << 10) |
|
||||||
|
g10);)
|
||||||
|
|
||||||
|
#undef DEFINE_GDK_RGB_GRAY_DIRECT
|
||||||
|
|
||||||
|
|
||||||
DEFINE_STAGED_CONVERTER (gdk_rgb_convert_gray_generic,
|
DEFINE_STAGED_CONVERTER (gdk_rgb_convert_gray_generic,
|
||||||
conv, gdk_rgb_gray_to_stage)
|
conv, gdk_rgb_gray_to_stage)
|
||||||
|
|
@ -3903,6 +3998,11 @@ gdk_rgb_select_conv (GdkRgbInfo *image_info)
|
||||||
conv_indexed = gdk_rgb_convert_indexed_lut;
|
conv_indexed = gdk_rgb_convert_indexed_lut;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GDK_RGB_FORMAT_555_BR:
|
||||||
|
conv_gray = gdk_rgb_convert_gray_555_br;
|
||||||
|
conv_gray_d = gdk_rgb_convert_gray_555_br;
|
||||||
|
break;
|
||||||
|
|
||||||
case GDK_RGB_FORMAT_565:
|
case GDK_RGB_FORMAT_565:
|
||||||
conv_32 = gdk_rgb_convert_32_565;
|
conv_32 = gdk_rgb_convert_32_565;
|
||||||
conv_32_d = gdk_rgb_convert_32_565_d;
|
conv_32_d = gdk_rgb_convert_32_565_d;
|
||||||
|
|
@ -3910,26 +4010,50 @@ gdk_rgb_select_conv (GdkRgbInfo *image_info)
|
||||||
conv_indexed = gdk_rgb_convert_indexed_lut;
|
conv_indexed = gdk_rgb_convert_indexed_lut;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GDK_RGB_FORMAT_565_BR:
|
||||||
|
conv_gray = gdk_rgb_convert_gray_565_br;
|
||||||
|
conv_gray_d = gdk_rgb_convert_gray_565_br;
|
||||||
|
break;
|
||||||
|
|
||||||
case GDK_RGB_FORMAT_0888:
|
case GDK_RGB_FORMAT_0888:
|
||||||
conv_32 = gdk_rgb_convert_32_0888;
|
conv_32 = gdk_rgb_convert_32_0888;
|
||||||
conv_32_d = gdk_rgb_convert_32_0888;
|
conv_32_d = gdk_rgb_convert_32_0888;
|
||||||
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
conv_gray = gdk_rgb_convert_gray_0888;
|
||||||
conv_gray = gdk_rgb_convert_gray_0888_native;
|
conv_gray_d = gdk_rgb_convert_gray_0888;
|
||||||
conv_gray_d = gdk_rgb_convert_gray_0888_native;
|
|
||||||
#endif
|
|
||||||
conv_indexed = gdk_rgb_convert_indexed_lut;
|
conv_indexed = gdk_rgb_convert_indexed_lut;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GDK_RGB_FORMAT_0888_BR:
|
case GDK_RGB_FORMAT_0888_BR:
|
||||||
conv_32 = gdk_rgb_convert_32_0888_br;
|
conv_32 = gdk_rgb_convert_32_0888_br;
|
||||||
conv_32_d = gdk_rgb_convert_32_0888_br;
|
conv_32_d = gdk_rgb_convert_32_0888_br;
|
||||||
#if G_BYTE_ORDER == G_BIG_ENDIAN
|
conv_gray = gdk_rgb_convert_gray_0888_br;
|
||||||
conv_gray = gdk_rgb_convert_gray_0888_native;
|
conv_gray_d = gdk_rgb_convert_gray_0888_br;
|
||||||
conv_gray_d = gdk_rgb_convert_gray_0888_native;
|
|
||||||
#endif
|
|
||||||
conv_indexed = gdk_rgb_convert_indexed_lut;
|
conv_indexed = gdk_rgb_convert_indexed_lut;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GDK_RGB_FORMAT_888_LSB:
|
||||||
|
case GDK_RGB_FORMAT_888_MSB:
|
||||||
|
conv_gray = gdk_rgb_convert_gray_888;
|
||||||
|
conv_gray_d = gdk_rgb_convert_gray_888;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_RGB_FORMAT_8880_BR:
|
||||||
|
conv_gray = gdk_rgb_convert_gray_8880_br;
|
||||||
|
conv_gray_d = gdk_rgb_convert_gray_8880_br;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_RGB_FORMAT_101010_R_LOW_LSB:
|
||||||
|
case GDK_RGB_FORMAT_101010_B_LOW_LSB:
|
||||||
|
conv_gray = gdk_rgb_convert_gray_101010_lsb;
|
||||||
|
conv_gray_d = gdk_rgb_convert_gray_101010_lsb;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_RGB_FORMAT_101010_R_LOW_MSB:
|
||||||
|
case GDK_RGB_FORMAT_101010_B_LOW_MSB:
|
||||||
|
conv_gray = gdk_rgb_convert_gray_101010_msb;
|
||||||
|
conv_gray_d = gdk_rgb_convert_gray_101010_msb;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue