-
Notifications
You must be signed in to change notification settings - Fork 136
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Image decode API for color spaces and gamma correction. #39
Comments
Code has landed to decode PNG's cHRM, gAMA, iCCP and sRGB chunks. The This is all admittedly very rough and under-documented. This is relatively new code, a work in progress, and in terms of prioritizing limited work time, documentation competes with other feature work. That
Currently, the For chunks other than gAMA, this patch below demonstrates how to get the raw data but, today, you will need additional third party code (e.g. Skia's Color Management System, skcms) to do something with that data (other than printf it). For manual testing, diff --git a/example/imageviewer/imageviewer.cc b/example/imageviewer/imageviewer.cc
index 96938453..21b12ff9 100644
--- a/example/imageviewer/imageviewer.cc
+++ b/example/imageviewer/imageviewer.cc
@@ -167,14 +167,33 @@ class MyDecodeImageCallbacks : public wuffs_aux::DecodeImageCallbacks {
std::string //
HandleMetadata(const wuffs_base__more_information& minfo,
wuffs_base__slice_u8 raw) override {
- if (minfo.flavor == WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED) {
- switch (minfo.metadata__fourcc()) {
- case WUFFS_BASE__FOURCC__GAMA:
- // metadata_parsed__gama returns the inverse gamma scaled by 1e5.
- m_combined_gamma =
- 1e5 / (g_flags.screen_gamma * minfo.metadata_parsed__gama());
- break;
- }
+ switch (minfo.metadata__fourcc()) {
+ case WUFFS_BASE__FOURCC__CHRM:
+ printf(
+ " HandleMetadata chrm_wx=%u\n",
+ minfo.metadata_parsed__chrm(
+ WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__WHITE_X));
+ printf(
+ " HandleMetadata chrm_wy=%u\n",
+ minfo.metadata_parsed__chrm(
+ WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__WHITE_Y));
+ printf(" HandleMetadata chrm_rx=%u\n",
+ minfo.metadata_parsed__chrm(
+ WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__RED_X));
+ // Etcetera.
+ break;
+ case WUFFS_BASE__FOURCC__GAMA:
+ printf(" HandleMetadata gama=%u\n", minfo.metadata_parsed__gama());
+ // metadata_parsed__gama returns the inverse gamma scaled by 1e5.
+ m_combined_gamma =
+ 1e5 / (g_flags.screen_gamma * minfo.metadata_parsed__gama());
+ break;
+ case WUFFS_BASE__FOURCC__ICCP:
+ printf(" HandleMetadata iccp ptr=%p len=%zu\n", raw.ptr, raw.len);
+ break;
+ case WUFFS_BASE__FOURCC__SRGB:
+ printf(" HandleMetadata srgb=%u\n", minfo.metadata_parsed__srgb());
+ break;
}
return wuffs_aux::DecodeImageCallbacks::HandleMetadata(minfo, raw);
}
@@ -243,7 +262,10 @@ load_image(const char* filename) {
uint64_t dia_flags = 0;
if (g_flags.screen_gamma > 0) {
+ dia_flags |= wuffs_aux::DecodeImageArgFlags::REPORT_METADATA_CHRM;
dia_flags |= wuffs_aux::DecodeImageArgFlags::REPORT_METADATA_GAMA;
+ dia_flags |= wuffs_aux::DecodeImageArgFlags::REPORT_METADATA_ICCP;
+ dia_flags |= wuffs_aux::DecodeImageArgFlags::REPORT_METADATA_SRGB;
}
MyDecodeImageCallbacks callbacks; |
I forgot to mention: this has landed in |
|
Thanks, I have a terrible backlog that includes learning OpenGL, but I'll try to integrate and test it soon-ish. |
As far as I can tell, it works very well and there is nothing to add, except for, perhaps, documentation of all the possibilities within supported formats. Luckily, so far I haven't felt a need to special-case any format. One ugly detail: |
wuffs_base
should have some way to represent or process a PNG image's gAMA, iCCP or similar chunks.The text was updated successfully, but these errors were encountered: