summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2017-03-15 14:27:31 +0000
committerCaolán McNamara <caolanm@redhat.com>2017-03-16 08:56:07 +0000
commitf239ef0faa9e2b8c9ab0dec4c5ec6772a8c36845 (patch)
treefa3843da409d5ddaa71c5b0a63d52f0c490f5a0f /vcl
parentceb53ad9f34ae05d09f61845d581546eac0c6d60 (diff)
avoid slow conversion between scanline format and dest format
when we can, e.g. for the svp/gtk3 case Change-Id: I74f7b01004423f27ed2f142b325c2c74b4de290b Reviewed-on: https://gerrit.libreoffice.org/35229 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/source/filter/jpeg/jpegc.cxx70
1 files changed, 44 insertions, 26 deletions
diff --git a/vcl/source/filter/jpeg/jpegc.cxx b/vcl/source/filter/jpeg/jpegc.cxx
index 8b5b483cf946..8d9b1626022d 100644
--- a/vcl/source/filter/jpeg/jpegc.cxx
+++ b/vcl/source/filter/jpeg/jpegc.cxx
@@ -157,19 +157,41 @@ void ReadJPEG( JPEGReader* pJPEGReader, void* pInputStream, long* pLines,
if (pAccess)
{
- ScanlineFormat eScanlineFormat = ScanlineFormat::N24BitTcRgb;
int nPixelSize = 3;
+ J_COLOR_SPACE best_out_color_space = JCS_RGB;
+ ScanlineFormat eScanlineFormat = ScanlineFormat::N24BitTcRgb;
+ ScanlineFormat eFinalFormat = pAccess->GetScanlineFormat();
+
+ if (eFinalFormat == ScanlineFormat::N32BitTcBgra)
+ {
+ best_out_color_space = JCS_EXT_BGRA;
+ eScanlineFormat = eFinalFormat;
+ nPixelSize = 4;
+ }
+ else if (eFinalFormat == ScanlineFormat::N32BitTcRgba)
+ {
+ best_out_color_space = JCS_EXT_RGBA;
+ eScanlineFormat = eFinalFormat;
+ nPixelSize = 4;
+ }
+ else if (eFinalFormat == ScanlineFormat::N32BitTcArgb)
+ {
+ best_out_color_space = JCS_EXT_ARGB;
+ eScanlineFormat = eFinalFormat;
+ nPixelSize = 4;
+ }
+
if ( cinfo.jpeg_color_space == JCS_YCbCr )
- cinfo.out_color_space = JCS_RGB;
+ cinfo.out_color_space = best_out_color_space;
else if ( cinfo.jpeg_color_space == JCS_YCCK )
cinfo.out_color_space = JCS_CMYK;
if (cinfo.out_color_space != JCS_CMYK &&
cinfo.out_color_space != JCS_GRAYSCALE &&
- cinfo.out_color_space != JCS_RGB)
+ cinfo.out_color_space != best_out_color_space)
{
- SAL_WARN("vcl.filter", "jpg with unknown out color space, forcing to rgb");
- cinfo.out_color_space = JCS_RGB;
+ SAL_WARN("vcl.filter", "jpg with unknown out color space, forcing to :" << best_out_color_space);
+ cinfo.out_color_space = best_out_color_space;
}
JSAMPLE* aRangeLimit = cinfo.sample_range_limit;
@@ -199,36 +221,32 @@ void ReadJPEG( JPEGReader* pJPEGReader, void* pInputStream, long* pLines,
{
size_t yIndex = *pLines;
- if (cinfo.out_color_space == JCS_CMYK)
- {
- sal_uInt8* p = pCYMKBuffer.data();
- jpeg_read_scanlines(&cinfo, reinterpret_cast<JSAMPARRAY>(&p), 1);
+ sal_uInt8* p = (cinfo.out_color_space == JCS_CMYK) ? pCYMKBuffer.data() : pScanLineBuffer.data();
+ jpeg_read_scanlines(&cinfo, reinterpret_cast<JSAMPARRAY>(&p), 1);
+ if (bGray)
+ {
+ for (long x = 0; x < nWidth; ++x)
+ {
+ sal_uInt8 nColorGray = pScanLineBuffer[x];
+ pAccess->SetPixel(yIndex, x, pCols[nColorGray]);
+ }
+ }
+ else if (cinfo.out_color_space == JCS_CMYK)
+ {
// convert CMYK to RGB
- for (int cmyk = 0, rgb = 0; cmyk < nWidth * 4; cmyk += 4, rgb += 3)
+ for (long cmyk = 0, x = 0; cmyk < nWidth * 4; cmyk += 4, ++x)
{
int color_C = 255 - pCYMKBuffer[cmyk + 0];
int color_M = 255 - pCYMKBuffer[cmyk + 1];
int color_Y = 255 - pCYMKBuffer[cmyk + 2];
int color_K = 255 - pCYMKBuffer[cmyk + 3];
- pScanLineBuffer[rgb + 0] = aRangeLimit[255L - (color_C + color_K)];
- pScanLineBuffer[rgb + 1] = aRangeLimit[255L - (color_M + color_K)];
- pScanLineBuffer[rgb + 2] = aRangeLimit[255L - (color_Y + color_K)];
- }
- }
- else
- {
- sal_uInt8* p = pScanLineBuffer.data();
- jpeg_read_scanlines(&cinfo, reinterpret_cast<JSAMPARRAY>(&p), 1);
- }
+ sal_uInt8 cRed = aRangeLimit[255L - (color_C + color_K)];
+ sal_uInt8 cGreen = aRangeLimit[255L - (color_M + color_K)];
+ sal_uInt8 cBlue = aRangeLimit[255L - (color_Y + color_K)];
- if (bGray)
- {
- for (long x = 0; x < nWidth; ++x)
- {
- sal_uInt8 nColorGray = pScanLineBuffer[x];
- pAccess->SetPixel(yIndex, x, pCols[nColorGray]);
+ pAccess->SetPixel(yIndex, x, BitmapColor(cRed, cGreen, cBlue));
}
}
else