r16g16b16a16_to_float,
r16g16b16a16_from_float,
},
+ [GDK_MEMORY_R16G16B16A16] = {
+ GDK_MEMORY_ALPHA_STRAIGHT,
+ 8,
+ G_ALIGNOF (guint16),
+ TRUE,
+ TRUE,
+ { GL_RGBA16, GL_RGBA, GL_UNSIGNED_SHORT },
+ r16g16b16a16_to_float,
+ r16g16b16a16_from_float,
+ },
[GDK_MEMORY_R16G16B16_FLOAT] = {
GDK_MEMORY_ALPHA_OPAQUE,
6,
r16g16b16a16_float_to_float,
r16g16b16a16_float_from_float,
},
+ [GDK_MEMORY_R16G16B16A16_FLOAT] = {
+ GDK_MEMORY_ALPHA_STRAIGHT,
+ 8,
+ G_ALIGNOF (guint16),
+ TRUE,
+ TRUE,
+ { GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT },
+ r16g16b16a16_float_to_float,
+ r16g16b16a16_float_from_float,
+ },
[GDK_MEMORY_R32G32B32_FLOAT] = {
GDK_MEMORY_ALPHA_OPAQUE,
12,
{ GL_RGBA32F, GL_RGBA, GL_FLOAT },
r32g32b32a32_float_to_float,
r32g32b32a32_float_from_float,
+ },
+ [GDK_MEMORY_R32G32B32A32_FLOAT] = {
+ GDK_MEMORY_ALPHA_STRAIGHT,
+ 16,
+ G_ALIGNOF (float),
+ TRUE,
+ TRUE,
+ { GL_RGBA32F, GL_RGBA, GL_FLOAT },
+ r32g32b32a32_float_to_float,
+ r32g32b32a32_float_from_float,
}
};
* @GDK_MEMORY_R16G16B16A16_PREMULTIPLIED: 4 guint16 values; for red, green,
* blue, alpha. The color values are premultiplied with the alpha value.
* Since 4.6
+ * @GDK_MEMORY_R16G16B16A16: 4 guint16 values; for red, green, blue, alpha.
+ * Since 4.6
* @GDK_MEMORY_R16G16B16_FLOAT: 3 half-float values; for red, green, blue.
* The data is opaque. Since 4.6
* @GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED: 4 half-float values; for
* red, green, blue and alpha. The color values are premultiplied with
* the alpha value. Since 4.6
+ * @GDK_MEMORY_R16G16B16A16_FLOAT: 4 half-float values; for red, green,
+ * blue and alpha. Since 4.6
* @GDK_MEMORY_B32G32R32_FLOAT: 3 float values; for blue, green, red.
* The data is opaque. Since 4.6
* @GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED: 4 float values; for
* red, green, blue and alpha. The color values are premultiplied with
* the alpha value. Since 4.6
+ * @GDK_MEMORY_R32G32B32A32_FLOAT: 4 float values; for red, green, blue and
+ * alpha. Since 4.6
* @GDK_MEMORY_N_FORMATS: The number of formats. This value will change as
* more formats get added, so do not rely on its concrete integer.
*
GDK_MEMORY_B8G8R8,
GDK_MEMORY_R16G16B16,
GDK_MEMORY_R16G16B16A16_PREMULTIPLIED,
+ GDK_MEMORY_R16G16B16A16,
GDK_MEMORY_R16G16B16_FLOAT,
GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED,
+ GDK_MEMORY_R16G16B16A16_FLOAT,
GDK_MEMORY_R32G32B32_FLOAT,
GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED,
+ GDK_MEMORY_R32G32B32A32_FLOAT,
GDK_MEMORY_N_FORMATS
} GdkMemoryFormat;
}
}
-static void
-premultiply_16bit (guchar *data,
- int width,
- int height,
- int stride)
-{
- gsize x, y;
- guint16 *src;
-
- for (y = 0; y < height; y++)
- {
- src = (guint16 *)data;
- for (x = 0; x < width; x++)
- {
- float alpha = src[x * 4 + 3] / 65535.f;
- src[x * 4 ] = (guint16) CLAMP (src[x * 4 ] * alpha, 0.f, 65535.f);
- src[x * 4 + 1] = (guint16) CLAMP (src[x * 4 + 1] * alpha, 0.f, 65535.f);
- src[x * 4 + 2] = (guint16) CLAMP (src[x * 4 + 2] * alpha, 0.f, 65535.f);
- }
-
- data += stride;
- }
-}
-
/* }}} */
/* {{{ Public API */
}
else
{
- format = GDK_MEMORY_R16G16B16A16_PREMULTIPLIED;
+ format = GDK_MEMORY_R16G16B16A16;
}
break;
case PNG_COLOR_TYPE_RGB:
png_read_image (png, row_pointers);
png_read_end (png, info);
- if (format == GDK_MEMORY_R16G16B16A16_PREMULTIPLIED)
- premultiply_16bit (buffer, width, height, stride);
-
out_bytes = g_bytes_new_take (buffer, height * stride);
texture = gdk_memory_texture_new (width, height, format, out_bytes, stride);
g_bytes_unref (out_bytes);
break;
case GDK_MEMORY_R16G16B16:
+ case GDK_MEMORY_R16G16B16A16:
case GDK_MEMORY_R16G16B16A16_PREMULTIPLIED:
case GDK_MEMORY_R16G16B16_FLOAT:
+ case GDK_MEMORY_R16G16B16A16_FLOAT:
case GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED:
case GDK_MEMORY_R32G32B32_FLOAT:
+ case GDK_MEMORY_R32G32B32A32_FLOAT:
case GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED:
data = g_malloc_n (width * 16, height);
gdk_texture_download_float (mtexture, (float *)data, width * 4);
case GDK_MEMORY_R16G16B16:
case GDK_MEMORY_R16G16B16A16_PREMULTIPLIED:
+ case GDK_MEMORY_R16G16B16A16:
return 1/65536.f;
case GDK_MEMORY_R16G16B16_FLOAT:
case GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED:
+ case GDK_MEMORY_R16G16B16A16_FLOAT:
return 0.0009765625f;
case GDK_MEMORY_R32G32B32_FLOAT:
case GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED:
+ case GDK_MEMORY_R32G32B32A32_FLOAT:
return FLT_EPSILON;
case GDK_MEMORY_N_FORMATS:
return 6;
case GDK_MEMORY_R16G16B16A16_PREMULTIPLIED:
+ case GDK_MEMORY_R16G16B16A16:
case GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED:
+ case GDK_MEMORY_R16G16B16A16_FLOAT:
return 8;
case GDK_MEMORY_R32G32B32_FLOAT:
return 12;
case GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED:
+ case GDK_MEMORY_R32G32B32A32_FLOAT:
return 16;
case GDK_MEMORY_N_FORMATS:
case GDK_MEMORY_R8G8B8A8:
case GDK_MEMORY_A8B8G8R8:
case GDK_MEMORY_R16G16B16A16_PREMULTIPLIED:
+ case GDK_MEMORY_R16G16B16A16:
case GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED:
+ case GDK_MEMORY_R16G16B16A16_FLOAT:
case GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED:
+ case GDK_MEMORY_R32G32B32A32_FLOAT:
return TRUE;
case GDK_MEMORY_N_FORMATS:
memcpy (data, pixels, 4 * sizeof (guint16));
}
break;
+ case GDK_MEMORY_R16G16B16A16:
+ {
+ guint16 pixels[4] = {
+ CLAMP (color->red * 65536.f, 0, 65535.f),
+ CLAMP (color->green * 65536.f, 0, 65535.f),
+ CLAMP (color->blue * 65536.f, 0, 65535.f),
+ CLAMP (color->alpha * 65536.f, 0, 65535.f),
+ };
+ memcpy (data, pixels, 4 * sizeof (guint16));
+ }
+ break;
case GDK_MEMORY_R16G16B16_FLOAT:
{
guint16 pixels[3] = {
memcpy (data, pixels, 4 * sizeof (guint16));
}
break;
+ case GDK_MEMORY_R16G16B16A16_FLOAT:
+ {
+ guint16 pixels[4] = {
+ float_to_half (color->red),
+ float_to_half (color->green),
+ float_to_half (color->blue),
+ float_to_half (color->alpha)
+ };
+ memcpy (data, pixels, 4 * sizeof (guint16));
+ }
+ break;
case GDK_MEMORY_R32G32B32_FLOAT:
{
float pixels[3] = {
memcpy (data, pixels, 4 * sizeof (float));
}
break;
+ case GDK_MEMORY_R32G32B32A32_FLOAT:
+ {
+ float pixels[4] = {
+ color->red,
+ color->green,
+ color->blue,
+ color->alpha
+ };
+ memcpy (data, pixels, 4 * sizeof (float));
+ }
+ break;
case GDK_MEMORY_N_FORMATS:
default:
g_assert_not_reached ();