ChannelType
gdk_memory_format_get_channel_type (GdkMemoryFormat format)
{ switch (format)
{ case GDK_MEMORY_R8G8B8: case GDK_MEMORY_B8G8R8: case GDK_MEMORY_B8G8R8A8_PREMULTIPLIED: case GDK_MEMORY_A8R8G8B8_PREMULTIPLIED: case GDK_MEMORY_R8G8B8A8_PREMULTIPLIED: case GDK_MEMORY_A8B8G8R8_PREMULTIPLIED: case GDK_MEMORY_B8G8R8A8: case GDK_MEMORY_A8R8G8B8: case GDK_MEMORY_R8G8B8A8: case GDK_MEMORY_A8B8G8R8: case GDK_MEMORY_B8G8R8X8: case GDK_MEMORY_X8R8G8B8: case GDK_MEMORY_R8G8B8X8: case GDK_MEMORY_X8B8G8R8: case GDK_MEMORY_G8: case GDK_MEMORY_G8A8: case GDK_MEMORY_G8A8_PREMULTIPLIED: case GDK_MEMORY_A8: case GDK_MEMORY_G8_B8R8_420: case GDK_MEMORY_G8_R8B8_420: case GDK_MEMORY_G8_B8R8_422: case GDK_MEMORY_G8_R8B8_422: case GDK_MEMORY_G8_B8R8_444: case GDK_MEMORY_G8_R8B8_444: case GDK_MEMORY_G8_B8_R8_410: case GDK_MEMORY_G8_R8_B8_410: case GDK_MEMORY_G8_B8_R8_411: case GDK_MEMORY_G8_R8_B8_411: case GDK_MEMORY_G8_B8_R8_420: case GDK_MEMORY_G8_R8_B8_420: case GDK_MEMORY_G8_B8_R8_422: case GDK_MEMORY_G8_R8_B8_422: case GDK_MEMORY_G8_B8_R8_444: case GDK_MEMORY_G8_R8_B8_444: case GDK_MEMORY_G8B8G8R8_422: case GDK_MEMORY_G8R8G8B8_422: case GDK_MEMORY_R8G8B8G8_422: case GDK_MEMORY_B8G8R8G8_422: return CHANNEL_UINT_8;
case GDK_MEMORY_R16G16B16: case GDK_MEMORY_R16G16B16A16_PREMULTIPLIED: case GDK_MEMORY_R16G16B16A16: case GDK_MEMORY_G16: case GDK_MEMORY_G16A16: case GDK_MEMORY_G16A16_PREMULTIPLIED: case GDK_MEMORY_A16: case GDK_MEMORY_G12X4_B12X4R12X4_420: case GDK_MEMORY_G16_B16R16_420: case GDK_MEMORY_X4G12_X4B12_X4R12_420: case GDK_MEMORY_X4G12_X4B12_X4R12_422: case GDK_MEMORY_X4G12_X4B12_X4R12_444: case GDK_MEMORY_G16_B16_R16_420: case GDK_MEMORY_G16_B16_R16_422: case GDK_MEMORY_G16_B16_R16_444: return CHANNEL_UINT_16;
case GDK_MEMORY_G10X6_B10X6R10X6_420: case GDK_MEMORY_X6G10_X6B10_X6R10_420: case GDK_MEMORY_X6G10_X6B10_X6R10_422: case GDK_MEMORY_X6G10_X6B10_X6R10_444: case GDK_MEMORY_ARGB2101010_PREMULTIPLIED: case GDK_MEMORY_ARGB2101010: case GDK_MEMORY_XRGB2101010: case GDK_MEMORY_ABGR2101010_PREMULTIPLIED: case GDK_MEMORY_ABGR2101010: case GDK_MEMORY_XBGR2101010: return CHANNEL_UINT_10;
case GDK_MEMORY_R16G16B16_FLOAT: case GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED: case GDK_MEMORY_R16G16B16A16_FLOAT: case GDK_MEMORY_A16_FLOAT: return CHANNEL_FLOAT_16;
case GDK_MEMORY_R32G32B32_FLOAT: case GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED: case GDK_MEMORY_R32G32B32A32_FLOAT: case GDK_MEMORY_A32_FLOAT: return CHANNEL_FLOAT_32;
case GDK_MEMORY_N_FORMATS: default:
g_assert_not_reached (); return CHANNEL_UINT_8;
}
}
/* return the number of color channels, ignoring alpha */
guint
gdk_memory_format_n_colors (GdkMemoryFormat format)
{ switch (format)
{ case GDK_MEMORY_R8G8B8: case GDK_MEMORY_B8G8R8: case GDK_MEMORY_R16G16B16: case GDK_MEMORY_R16G16B16_FLOAT: case GDK_MEMORY_R32G32B32_FLOAT: case GDK_MEMORY_B8G8R8A8_PREMULTIPLIED: case GDK_MEMORY_A8R8G8B8_PREMULTIPLIED: case GDK_MEMORY_R8G8B8A8_PREMULTIPLIED: case GDK_MEMORY_A8B8G8R8_PREMULTIPLIED: case GDK_MEMORY_B8G8R8A8: case GDK_MEMORY_A8R8G8B8: case GDK_MEMORY_R8G8B8A8: case GDK_MEMORY_A8B8G8R8: case GDK_MEMORY_B8G8R8X8: case GDK_MEMORY_X8R8G8B8: case GDK_MEMORY_R8G8B8X8: case GDK_MEMORY_X8B8G8R8: 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: case GDK_MEMORY_G8_B8R8_420: case GDK_MEMORY_G8_R8B8_420: case GDK_MEMORY_G8_B8R8_422: case GDK_MEMORY_G8_R8B8_422: case GDK_MEMORY_G8_B8R8_444: case GDK_MEMORY_G8_R8B8_444: case GDK_MEMORY_G10X6_B10X6R10X6_420: case GDK_MEMORY_G12X4_B12X4R12X4_420: case GDK_MEMORY_G16_B16R16_420: case GDK_MEMORY_G8_B8_R8_410: case GDK_MEMORY_G8_R8_B8_410: case GDK_MEMORY_G8_B8_R8_411: case GDK_MEMORY_G8_R8_B8_411: case GDK_MEMORY_G8_B8_R8_420: case GDK_MEMORY_G8_R8_B8_420: case GDK_MEMORY_G8_B8_R8_422: case GDK_MEMORY_G8_R8_B8_422: case GDK_MEMORY_G8_B8_R8_444: case GDK_MEMORY_G8_R8_B8_444: case GDK_MEMORY_G8B8G8R8_422: case GDK_MEMORY_G8R8G8B8_422: case GDK_MEMORY_R8G8B8G8_422: case GDK_MEMORY_B8G8R8G8_422: case GDK_MEMORY_X6G10_X6B10_X6R10_420: case GDK_MEMORY_X6G10_X6B10_X6R10_422: case GDK_MEMORY_X6G10_X6B10_X6R10_444: case GDK_MEMORY_X4G12_X4B12_X4R12_420: case GDK_MEMORY_X4G12_X4B12_X4R12_422: case GDK_MEMORY_X4G12_X4B12_X4R12_444: case GDK_MEMORY_G16_B16_R16_420: case GDK_MEMORY_G16_B16_R16_422: case GDK_MEMORY_G16_B16_R16_444: case GDK_MEMORY_ARGB2101010_PREMULTIPLIED: case GDK_MEMORY_ARGB2101010: case GDK_MEMORY_XRGB2101010: case GDK_MEMORY_ABGR2101010_PREMULTIPLIED: case GDK_MEMORY_ABGR2101010: case GDK_MEMORY_XBGR2101010: return3;
case GDK_MEMORY_G8: case GDK_MEMORY_G16: case GDK_MEMORY_G8A8_PREMULTIPLIED: case GDK_MEMORY_G8A8: case GDK_MEMORY_G16A16_PREMULTIPLIED: case GDK_MEMORY_G16A16: return1;
case GDK_MEMORY_A8: case GDK_MEMORY_A16: case GDK_MEMORY_A16_FLOAT: case GDK_MEMORY_A32_FLOAT: return0;
case GDK_MEMORY_N_FORMATS: default:
g_assert_not_reached (); returnTRUE;
}
}
void
gdk_memory_pixel_print (const guchar *data, const GdkMemoryLayout *layout,
gsize x,
gsize y,
GString *string)
{ switch (layout->format)
{ case GDK_MEMORY_B8G8R8A8_PREMULTIPLIED: case GDK_MEMORY_A8R8G8B8_PREMULTIPLIED: case GDK_MEMORY_R8G8B8A8_PREMULTIPLIED: case GDK_MEMORY_A8B8G8R8_PREMULTIPLIED: case GDK_MEMORY_B8G8R8A8: case GDK_MEMORY_A8R8G8B8: case GDK_MEMORY_R8G8B8A8: case GDK_MEMORY_A8B8G8R8:
data += gdk_memory_layout_offset (layout, 0, x, y);
g_string_append_printf (string, "%02X %02X %02X %02X", data[0], data[1], data[2], data[3]); break;
case GDK_MEMORY_B8G8R8X8: case GDK_MEMORY_R8G8B8X8: case GDK_MEMORY_R8G8B8: case GDK_MEMORY_B8G8R8:
data += gdk_memory_layout_offset (layout, 0, x, y);
g_string_append_printf (string, "%02X %02X %02X", data[0], data[1], data[2]); break;
case GDK_MEMORY_G8A8: case GDK_MEMORY_G8A8_PREMULTIPLIED:
data += gdk_memory_layout_offset (layout, 0, x, y);
g_string_append_printf (string, "%02X %02X", data[0], data[1]); break;
case GDK_MEMORY_A8: case GDK_MEMORY_G8:
data += gdk_memory_layout_offset (layout, 0, x, y);
g_string_append_printf (string, "%02X", data[0]); break;
case GDK_MEMORY_X8R8G8B8: case GDK_MEMORY_X8B8G8R8:
data += gdk_memory_layout_offset (layout, 0, x, y);
g_string_append_printf (string, "%02X %02X %02X", data[1], data[2], data[3]); break;
case GDK_MEMORY_ARGB2101010_PREMULTIPLIED: case GDK_MEMORY_ARGB2101010: case GDK_MEMORY_ABGR2101010_PREMULTIPLIED: case GDK_MEMORY_ABGR2101010:
{
guint32 v = GUINT32_FROM_LE (*(guint32 *) (data + gdk_memory_layout_offset (layout, 0, x, y)));
g_string_append_printf (string, "%08X", v);
} break;
case GDK_MEMORY_XRGB2101010: case GDK_MEMORY_XBGR2101010:
{
guint32 v = GUINT32_FROM_LE (*(guint32 *) (data + gdk_memory_layout_offset (layout, 0, x, y)));
g_string_append_printf (string, "%08X", v & 0x3FFFFFFF);
} break;
/* multiplanar */ case GDK_MEMORY_G8_B8R8_420: case GDK_MEMORY_G8_R8B8_420: case GDK_MEMORY_G8_B8R8_422: case GDK_MEMORY_G8_R8B8_422: case GDK_MEMORY_G8_B8R8_444: case GDK_MEMORY_G8_R8B8_444:
{ const guchar *y_data = data + gdk_memory_layout_offset (layout, 0, x, y); const guchar *uv_data = data + gdk_memory_layout_offset (layout, 1,
x - x % gdk_memory_format_get_plane_block_width (layout->format, 1),
y - y % gdk_memory_format_get_plane_block_height (layout->format, 1));
g_string_append_printf (string, "%02X %02X %02X", y_data[0], uv_data[0], uv_data[1]);
} break;
case GDK_MEMORY_G10X6_B10X6R10X6_420: case GDK_MEMORY_G12X4_B12X4R12X4_420: case GDK_MEMORY_G16_B16R16_420:
{ const guint16 *y_data = (const guint16 *) (data + gdk_memory_layout_offset (layout, 0, x, y)); const guint16 *uv_data = (const guint16 *) (data + gdk_memory_layout_offset (layout, 1,
x - x % gdk_memory_format_get_plane_block_width (layout->format, 1),
y - y % gdk_memory_format_get_plane_block_height (layout->format, 1)));
g_string_append_printf (string, "%04X %04X %04X", y_data[0], uv_data[0], uv_data[1]);
} break;
case GDK_MEMORY_G8_B8_R8_410: case GDK_MEMORY_G8_R8_B8_410: case GDK_MEMORY_G8_B8_R8_411: case GDK_MEMORY_G8_R8_B8_411: case GDK_MEMORY_G8_B8_R8_420: case GDK_MEMORY_G8_R8_B8_420: case GDK_MEMORY_G8_B8_R8_422: case GDK_MEMORY_G8_R8_B8_422: case GDK_MEMORY_G8_B8_R8_444: case GDK_MEMORY_G8_R8_B8_444:
{ const guchar *y_data = data + gdk_memory_layout_offset (layout, 0, x, y); const guchar *u_data = data + gdk_memory_layout_offset (layout, 1,
x - x % gdk_memory_format_get_plane_block_width (layout->format, 1),
y - y % gdk_memory_format_get_plane_block_height (layout->format, 1)); const guchar *v_data = data + gdk_memory_layout_offset (layout, 2,
x - x % gdk_memory_format_get_plane_block_width (layout->format, 2),
y - y % gdk_memory_format_get_plane_block_height (layout->format, 2));
g_string_append_printf (string, "%02X %02X %02X", y_data[0], u_data[0], v_data[0]);
} break;
case GDK_MEMORY_X6G10_X6B10_X6R10_420: case GDK_MEMORY_X6G10_X6B10_X6R10_422: case GDK_MEMORY_X6G10_X6B10_X6R10_444: case GDK_MEMORY_X4G12_X4B12_X4R12_420: case GDK_MEMORY_X4G12_X4B12_X4R12_422: case GDK_MEMORY_X4G12_X4B12_X4R12_444: case GDK_MEMORY_G16_B16_R16_420: case GDK_MEMORY_G16_B16_R16_422: case GDK_MEMORY_G16_B16_R16_444:
{ const guint16 *y_data = (const guint16 *) (data + gdk_memory_layout_offset (layout, 0, x, y)); const guint16 *u_data = (const guint16 *) (data + gdk_memory_layout_offset (layout, 1,
x - x % gdk_memory_format_get_plane_block_width (layout->format, 1),
y - y % gdk_memory_format_get_plane_block_height (layout->format, 1))); const guint16 *v_data = (const guint16 *) (data + gdk_memory_layout_offset (layout, 2,
x - x % gdk_memory_format_get_plane_block_width (layout->format, 2),
y - y % gdk_memory_format_get_plane_block_height (layout->format, 2)));
guint16 mask = gdk_memory_format_get_default_shader_op (layout->format) == GDK_SHADER_3_PLANES_10BIT_LSB ? 0x3FF :
gdk_memory_format_get_default_shader_op (layout->format) == GDK_SHADER_3_PLANES_12BIT_LSB ? 0xFFF : 0xFFFF;
g_string_append_printf (string, "%04X %04X %04X", y_data[0] & mask, u_data[0] & mask, v_data[0] & mask);
} break;
case GDK_MEMORY_G8B8G8R8_422: case GDK_MEMORY_G8R8G8B8_422: case GDK_MEMORY_R8G8B8G8_422: case GDK_MEMORY_B8G8R8G8_422:
data += gdk_memory_layout_offset (layout, 0, x & ~1, y);
g_string_append_printf (string, "%02X %02X %02X %02X", data[0], data[1], data[2], data[3]); break;
case GDK_MEMORY_N_FORMATS: default:
g_assert_not_reached ();
}
}
switch (layout1->format)
{ case GDK_MEMORY_B8G8R8A8_PREMULTIPLIED: case GDK_MEMORY_A8R8G8B8_PREMULTIPLIED: case GDK_MEMORY_R8G8B8A8_PREMULTIPLIED: case GDK_MEMORY_A8B8G8R8_PREMULTIPLIED: case GDK_MEMORY_R8G8B8: case GDK_MEMORY_B8G8R8: case GDK_MEMORY_B8G8R8A8: case GDK_MEMORY_A8R8G8B8: case GDK_MEMORY_R8G8B8A8: case GDK_MEMORY_A8B8G8R8: case GDK_MEMORY_A8: case GDK_MEMORY_G8: case GDK_MEMORY_G8A8: case GDK_MEMORY_G8A8_PREMULTIPLIED: return memcmp (data1 + gdk_memory_layout_offset (layout1, 0, x, y),
data2 + gdk_memory_layout_offset (layout2, 0, x, y),
gdk_memory_format_get_plane_block_bytes (layout1->format, 0)) == 0;
case GDK_MEMORY_G8_B8_R8_410: case GDK_MEMORY_G8_R8_B8_410: case GDK_MEMORY_G8_B8_R8_411: case GDK_MEMORY_G8_R8_B8_411: case GDK_MEMORY_G8_B8_R8_420: case GDK_MEMORY_G8_R8_B8_420: case GDK_MEMORY_G8_B8_R8_422: case GDK_MEMORY_G8_R8_B8_422: case GDK_MEMORY_G8_B8_R8_444: case GDK_MEMORY_G8_R8_B8_444: return *(data1 + gdk_memory_layout_offset (layout1, 0, x, y)) ==
*(data2 + gdk_memory_layout_offset (layout2, 0, x, y)) &&
*(data1 + gdk_memory_layout_offset (layout1, 1,
x - x % gdk_memory_format_get_plane_block_width (layout1->format, 1),
y - y % gdk_memory_format_get_plane_block_height (layout1->format, 1))) ==
*(data2 + gdk_memory_layout_offset (layout2, 1,
x - x % gdk_memory_format_get_plane_block_width (layout2->format, 1),
y - y % gdk_memory_format_get_plane_block_height (layout2->format, 1))) &&
*(data1 + gdk_memory_layout_offset (layout1, 2,
x - x % gdk_memory_format_get_plane_block_width (layout1->format, 2),
y - y % gdk_memory_format_get_plane_block_height (layout1->format, 2))) ==
*(data2 + gdk_memory_layout_offset (layout2, 2,
x - x % gdk_memory_format_get_plane_block_width (layout2->format, 2),
y - y % gdk_memory_format_get_plane_block_height (layout2->format, 2)));
case GDK_MEMORY_X6G10_X6B10_X6R10_420: case GDK_MEMORY_X6G10_X6B10_X6R10_422: case GDK_MEMORY_X6G10_X6B10_X6R10_444: case GDK_MEMORY_X4G12_X4B12_X4R12_420: case GDK_MEMORY_X4G12_X4B12_X4R12_422: case GDK_MEMORY_X4G12_X4B12_X4R12_444: case GDK_MEMORY_G16_B16_R16_420: case GDK_MEMORY_G16_B16_R16_422: case GDK_MEMORY_G16_B16_R16_444:
{ const guint16 *y1 = (const guint16 *) (data1 + gdk_memory_layout_offset (layout1, 0, x, y)); const guint16 *y2 = (const guint16 *) (data2 + gdk_memory_layout_offset (layout2, 0, x, y)); const guint16 *u1 = (const guint16 *) (data1 + gdk_memory_layout_offset (layout1, 1,
x - x % gdk_memory_format_get_plane_block_width (layout1->format, 1),
y - y % gdk_memory_format_get_plane_block_height (layout1->format, 1))); const guint16 *u2 = (const guint16 *) (data2 + gdk_memory_layout_offset (layout2, 1,
x - x % gdk_memory_format_get_plane_block_width (layout2->format, 1),
y - y % gdk_memory_format_get_plane_block_height (layout2->format, 1))); const guint16 *v1 = (const guint16 *) (data1 + gdk_memory_layout_offset (layout1, 2,
x - x % gdk_memory_format_get_plane_block_width (layout1->format, 2),
y - y % gdk_memory_format_get_plane_block_height (layout1->format, 2))); const guint16 *v2 = (const guint16 *) (data2 + gdk_memory_layout_offset (layout2, 2,
x - x % gdk_memory_format_get_plane_block_width (layout2->format, 2),
y - y % gdk_memory_format_get_plane_block_height (layout2->format, 2)));
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.