/* The main difference between the png load/save code here and *gdk-pixbufisthatwecansupportloading16-bitdatainthe *future,andwecanextractgammaandcolorspaceinformation *toproducelinear,color-correcteddata.
*/
/* {{{ Callbacks */
/* No sigsetjmp on Windows */ #ifndef HAVE_SIGSETJMP #define sigjmp_buf jmp_buf #define sigsetjmp(jb, x) setjmp(jb) #define siglongjmp longjmp #endif
#if PNG_LIBPNG_VER < 10645 typedefstruct
{
gboolean cicp_chunk_read; int color_primaries; int transfer_function; int matrix_coefficients; int range;
} CICPData;
if (png_get_sRGB (png, info, &intent)) return gdk_color_state_ref (GDK_COLOR_STATE_SRGB);
/* If neither of those is valid, the result is sRGB */ if (!png_get_valid (png, info, PNG_INFO_gAMA) &&
!png_get_valid (png, info, PNG_INFO_cHRM)) return GDK_COLOR_STATE_SRGB;
g_debug ("Failed to find color state, assuming SRGB");
png_set_unknown_chunks (png, info, &chunk, 1); #endif
} else
{ /* unsupported color state. Fall back to sRGB */
gdk_color_state_unref (color_state);
color_state = gdk_color_state_ref (gdk_color_state_get_srgb ());
}
/* For good measure, we add an sRGB chunk too */ if (gdk_color_state_equal (color_state, GDK_COLOR_STATE_SRGB))
png_set_sRGB (png, info, PNG_sRGB_INTENT_PERCEPTUAL);
if (!gdk_memory_layout_try_init (&layout, format, width, height, 1))
{
g_set_error (error,
GDK_TEXTURE_ERROR, GDK_TEXTURE_ERROR_TOO_LARGE,
_("Image stride too large for image size %ux%u"), width, height); return NULL;
}
if (GDK_PROFILER_IS_RUNNING)
{
gint64 end = GDK_PROFILER_CURRENT_TIME; if (end - before > 500000)
gdk_profiler_add_mark (before, end - before, "Load png", NULL);
}
switch (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:
format = GDK_MEMORY_R8G8B8A8;
png_format = PNG_COLOR_TYPE_RGB_ALPHA;
depth = 8; break;
case GDK_MEMORY_R8G8B8: case GDK_MEMORY_B8G8R8: case GDK_MEMORY_R8G8B8X8: case GDK_MEMORY_X8R8G8B8: case GDK_MEMORY_B8G8R8X8: case GDK_MEMORY_X8B8G8R8: 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:
format = GDK_MEMORY_R8G8B8;
png_format = PNG_COLOR_TYPE_RGB;
depth = 8; break;
case GDK_MEMORY_R16G16B16A16: case GDK_MEMORY_R16G16B16A16_PREMULTIPLIED: case GDK_MEMORY_R16G16B16A16_FLOAT: case GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED: case GDK_MEMORY_R32G32B32A32_FLOAT: case GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED: 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:
format = GDK_MEMORY_R16G16B16A16;
png_format = PNG_COLOR_TYPE_RGB_ALPHA;
depth = 16; break;
case GDK_MEMORY_R16G16B16: case GDK_MEMORY_R16G16B16_FLOAT: case GDK_MEMORY_R32G32B32_FLOAT: case GDK_MEMORY_G10X6_B10X6R10X6_420: case GDK_MEMORY_G12X4_B12X4R12X4_420: case GDK_MEMORY_G16_B16R16_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_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:
format = GDK_MEMORY_R16G16B16;
png_format = PNG_COLOR_TYPE_RGB;
depth = 16; break;
case GDK_MEMORY_G8:
format = GDK_MEMORY_G8;
png_format = PNG_COLOR_TYPE_GRAY;
depth = 8; break;
case GDK_MEMORY_G8A8_PREMULTIPLIED: case GDK_MEMORY_G8A8: case GDK_MEMORY_A8:
format = GDK_MEMORY_G8A8;
png_format = PNG_COLOR_TYPE_GRAY_ALPHA;
depth = 8; break;
case GDK_MEMORY_G16:
format = GDK_MEMORY_G16;
png_format = PNG_COLOR_TYPE_GRAY;
depth = 16; break;
case GDK_MEMORY_G16A16_PREMULTIPLIED: case GDK_MEMORY_G16A16: case GDK_MEMORY_A16: case GDK_MEMORY_A16_FLOAT: case GDK_MEMORY_A32_FLOAT:
format = GDK_MEMORY_G16A16;
png_format = PNG_COLOR_TYPE_GRAY_ALPHA;
depth = 16; break;
case GDK_MEMORY_N_FORMATS: default:
g_assert_not_reached ();
}
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.