From 8cd7bb84e95bdd1c122747a4cb0d5a65bb195179 Mon Sep 17 00:00:00 2001 From: HookedBehemoth Date: Sun, 19 Apr 2020 18:39:30 +0200 Subject: [PATCH] fix color space --- .../jpegdec/source/impl/jpegdec_turbo.cpp | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/stratosphere/jpegdec/source/impl/jpegdec_turbo.cpp b/stratosphere/jpegdec/source/impl/jpegdec_turbo.cpp index 2d0ea78c8..220a7c357 100644 --- a/stratosphere/jpegdec/source/impl/jpegdec_turbo.cpp +++ b/stratosphere/jpegdec/source/impl/jpegdec_turbo.cpp @@ -21,6 +21,9 @@ namespace ams::jpegdec::impl { namespace { + constexpr const size_t LinebufferCount = 4; + constexpr const size_t ColorComponents = 3; + struct RGB { u8 r, g, b; }; @@ -44,10 +47,9 @@ namespace ams::jpegdec::impl { AMS_ASSERT(out.width != nullptr); AMS_ASSERT(out.height != nullptr); - constexpr const size_t linebuffer_count = 4; - constexpr const size_t color_components = 3; - const size_t linebuffer_size = linebuffer_count * color_components * in.width; - R_UNLESS(work_size >= linebuffer_size, capsrv::ResultOutOfWorkMemory()); + const size_t linebuffer_size = ColorComponents * in.width; + const size_t total_linebuffer_size = LinebufferCount * linebuffer_size; + R_UNLESS(work_size >= total_linebuffer_size, capsrv::ResultOutOfWorkMemory()); jpeg_decompress_struct cinfo; std::memset(&cinfo, 0, sizeof(cinfo)); @@ -71,10 +73,11 @@ namespace ams::jpegdec::impl { int res = jpeg_read_header(&cinfo, true); R_UNLESS(res == JPEG_HEADER_OK, capsrv::ResultInvalidFileData()); + R_UNLESS(cinfo.image_width == in.width, capsrv::ResultInvalidFileData()); R_UNLESS(cinfo.image_height == in.height, capsrv::ResultInvalidFileData()); - cinfo.out_color_space = JCS_EXT_BGR; + cinfo.out_color_space = JCS_RGB; cinfo.dct_method = JDCT_ISLOW; cinfo.do_fancy_upsampling = in.fancy_upsampling; cinfo.do_block_smoothing = in.block_smoothing; @@ -85,8 +88,9 @@ namespace ams::jpegdec::impl { R_UNLESS(cinfo.output_width == in.width, capsrv::ResultInvalidArgument()); R_UNLESS(cinfo.output_height == in.height, capsrv::ResultInvalidArgument()); - R_UNLESS(cinfo.out_color_components == 3, capsrv::ResultInvalidArgument()); - R_UNLESS(cinfo.output_components == 3, capsrv::ResultInvalidArgument()); + + R_UNLESS(cinfo.out_color_components == ColorComponents, capsrv::ResultInvalidArgument()); + R_UNLESS(cinfo.output_components == ColorComponents, capsrv::ResultInvalidArgument()); /* Pointer to output. */ RGBX *bmp = reinterpret_cast(out.bmp); @@ -104,15 +108,13 @@ namespace ams::jpegdec::impl { /* Decode scanlines. */ int parsed = jpeg_read_scanlines(&cinfo, linebuffer, 4); - /* Too few lines read, abort decompression. */ - R_UNLESS(parsed >= 4, capsrv::ResultInvalidArgument()); - /* Done! */ if (parsed == 0) break; /* Line by line */ - for (u8 *buffer : linebuffer) { + for (int index = 0; index < parsed; index++) { + u8 *buffer = linebuffer[index]; const RGB* rgb = reinterpret_cast(buffer); for (u32 i = 0; i < in.width; i++) { /* Fill output. */