diff options
Diffstat (limited to 'content/handlers/image/jpeg.c')
-rw-r--r-- | content/handlers/image/jpeg.c | 61 |
1 files changed, 43 insertions, 18 deletions
diff --git a/content/handlers/image/jpeg.c b/content/handlers/image/jpeg.c index 5ae9e70cd..123a0bf70 100644 --- a/content/handlers/image/jpeg.c +++ b/content/handlers/image/jpeg.c @@ -142,7 +142,7 @@ static void nsjpeg_term_source(j_decompress_ptr cinfo) static void nsjpeg_error_log(j_common_ptr cinfo) { cinfo->err->format_message(cinfo, nsjpeg_error_buffer); - LOG("%s", nsjpeg_error_buffer); + NSLOG(netsurf, INFO, "%s", nsjpeg_error_buffer); } @@ -156,7 +156,7 @@ static void nsjpeg_error_exit(j_common_ptr cinfo) jmp_buf *setjmp_buffer = (jmp_buf *) cinfo->client_data; cinfo->err->format_message(cinfo, nsjpeg_error_buffer); - LOG("%s", nsjpeg_error_buffer); + NSLOG(netsurf, INFO, "%s", nsjpeg_error_buffer); longjmp(*setjmp_buffer, 1); } @@ -214,7 +214,12 @@ jpeg_cache_convert(struct content *c) jpeg_read_header(&cinfo, TRUE); /* set output processing parameters */ - cinfo.out_color_space = JCS_RGB; + if (cinfo.jpeg_color_space == JCS_CMYK || + cinfo.jpeg_color_space == JCS_YCCK) { + cinfo.out_color_space = JCS_CMYK; + } else { + cinfo.out_color_space = JCS_RGB; + } cinfo.dct_method = JDCT_ISLOW; /* commence the decompression, output parameters now valid */ @@ -248,22 +253,42 @@ jpeg_cache_convert(struct content *c) rowstride * cinfo.output_scanline); jpeg_read_scanlines(&cinfo, scanlines, 1); + if (cinfo.out_color_space == JCS_CMYK) { + int i; + for (i = width - 1; 0 <= i; i--) { + /* Trivial inverse CMYK -> RGBA */ + const int c = scanlines[0][i * 4 + 0]; + const int m = scanlines[0][i * 4 + 1]; + const int y = scanlines[0][i * 4 + 2]; + const int k = scanlines[0][i * 4 + 3]; + + const int ck = c * k; + const int mk = m * k; + const int yk = y * k; + +#define DIV255(x) ((x) + 1 + ((x) >> 8)) >> 8 + scanlines[0][i * 4 + 0] = DIV255(ck); + scanlines[0][i * 4 + 1] = DIV255(mk); + scanlines[0][i * 4 + 2] = DIV255(yk); + scanlines[0][i * 4 + 3] = 0xff; +#undef DIV255 + } + } else { #if RGB_RED != 0 || RGB_GREEN != 1 || RGB_BLUE != 2 || RGB_PIXELSIZE != 4 -{ - /* Missmatch between configured libjpeg pixel format and - * NetSurf pixel format. Convert to RGBA */ - int i; - for (i = width - 1; 0 <= i; i--) { - int r = scanlines[0][i * RGB_PIXELSIZE + RGB_RED]; - int g = scanlines[0][i * RGB_PIXELSIZE + RGB_GREEN]; - int b = scanlines[0][i * RGB_PIXELSIZE + RGB_BLUE]; - scanlines[0][i * 4 + 0] = r; - scanlines[0][i * 4 + 1] = g; - scanlines[0][i * 4 + 2] = b; - scanlines[0][i * 4 + 3] = 0xff; - } -} + /* Missmatch between configured libjpeg pixel format and + * NetSurf pixel format. Convert to RGBA */ + int i; + for (i = width - 1; 0 <= i; i--) { + int r = scanlines[0][i * RGB_PIXELSIZE + RGB_RED]; + int g = scanlines[0][i * RGB_PIXELSIZE + RGB_GREEN]; + int b = scanlines[0][i * RGB_PIXELSIZE + RGB_BLUE]; + scanlines[0][i * 4 + 0] = r; + scanlines[0][i * 4 + 1] = g; + scanlines[0][i * 4 + 2] = b; + scanlines[0][i * 4 + 3] = 0xff; + } #endif + } } while (cinfo.output_scanline != cinfo.output_height); guit->bitmap->modified(bitmap); @@ -301,7 +326,7 @@ static bool nsjpeg_convert(struct content *c) jpeg_destroy_decompress(&cinfo); msg_data.error = nsjpeg_error_buffer; - content_broadcast(c, CONTENT_MSG_ERROR, msg_data); + content_broadcast(c, CONTENT_MSG_ERROR, &msg_data); return false; } |