jpeg decoder crashes when PL_PIXEL_RGBA_ORDER
is defined rather then PL_PIXEL_BGRA_ORDER.
I rewrote lines 131 - 182 in pljpegdec.cpp:
void PLJPEGDecoder::decodeRGB
( PLBmp * pBmp,
int w,
int h
)
// Assumes IJPEG decoder is already set up.
{
int CurLine = 0;
pBmp->Create (w, h, 32, false);
#if
((PL_RGBA_RED!=RGB_RED)||(PL_RGBA_GREEN!=RGB_GREEN)||(PL_RGBA_BLUE!=RGB_BLUE)||(4!=RGB_PIXELSIZE))
PLBYTE * pBuf = NULL;
JSAMPARRAY ppBuf = &pBuf;
pBuf = new PLBYTE[w*sizeof (PLPixel32)];
#endif
pBmp->Lock(false, true);
PLPixel32 ** pLineArray = pBmp->GetLineArray32();
int readed = 0;
while (CurLine < h)
{
// Correct pixel ordering if libjpeg is configured
differently
// than paintlib.
#if
((PL_RGBA_RED!=RGB_RED)||(PL_RGBA_GREEN!=RGB_GREEN)||(PL_RGBA_BLUE!=RGB_BLUE)||(4!=RGB_PIXELSIZE))
jpeg_read_scanlines (&cinfo, ppBuf, 1);
int i;
for (i=0;i<w;i++)
{
PLBYTE * pSrcPixel = pBuf+i*RGB_PIXELSIZE;
PLPixel32 * pDestPixel = pLineArray[CurLine]+i;
pDestPixel->SetR (pSrcPixel[RGB_RED]);
pDestPixel->SetG (pSrcPixel[RGB_GREEN]);
pDestPixel->SetB (pSrcPixel[RGB_BLUE]);
}
CurLine++;
#else
readed = jpeg_read_scanlines (&cinfo,(unsigned char
**)&pLineArray[CurLine],32);
CurLine+=min(readed,(h-CurLine));
if(readed==0)
break;
#endif
}
pBmp->Unlock();
#if
((PL_RGBA_RED!=RGB_RED)||(PL_RGBA_GREEN!=RGB_GREEN)||(PL_RGBA_BLUE!=RGB_BLUE)||(4!=RGB_PIXELSIZE))
if(pBuf)
{
delete[] pBuf;
}
#endif
}
to prevent the crash and to remove extranesnous code.
A similar issue of code bloat exists for pljpegenc.cpp
but no crash will occur there.