diff --git a/libfreerdp/codec/color.c b/libfreerdp/codec/color.c index fe268695c..343a14870 100644 --- a/libfreerdp/codec/color.c +++ b/libfreerdp/codec/color.c @@ -443,10 +443,10 @@ BOOL freerdp_image_copy(BYTE* pDstData, DWORD DstFormat, break; } - if (nDstStep < 0) + if (nDstStep <= 0) nDstStep = nWidth * GetBytesPerPixel(DstFormat); - if (nSrcStep < 0) + if (nSrcStep <= 0) nSrcStep = nWidth * GetBytesPerPixel(SrcFormat); if (vSrcVFlip) diff --git a/libfreerdp/codec/interleaved.c b/libfreerdp/codec/interleaved.c index 930e01b3e..2051713a6 100644 --- a/libfreerdp/codec/interleaved.c +++ b/libfreerdp/codec/interleaved.c @@ -247,12 +247,12 @@ static INLINE UINT32 ExtractRunLength(UINT32 code, const BYTE* pbOrderHdr, UINT3 #include "include/bitmap.c" INT32 interleaved_decompress(BITMAP_INTERLEAVED_CONTEXT* interleaved, - const BYTE* pSrcData, UINT32 SrcSize, - UINT32 bpp, - BYTE* pDstData, UINT32 DstFormat, - UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst, - UINT32 nWidth, UINT32 nHeight, - const UINT32* palette) + const BYTE* pSrcData, UINT32 SrcSize, + UINT32 bpp, + BYTE* pDstData, UINT32 DstFormat, + UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst, + UINT32 nWidth, UINT32 nHeight, + const UINT32* palette) { INT32 status; UINT32 scanline; @@ -270,87 +270,73 @@ INT32 interleaved_decompress(BITMAP_INTERLEAVED_CONTEXT* interleaved, if (nDstStep < 0) nDstStep = nWidth * dstBytesPerPixel; - if (bpp == 24) + switch(bpp) { + case 24: scanline = nWidth * 3; - BufferSize = scanline * nHeight; - - SrcFormat = PIXEL_FORMAT_BGR24_VF; - - if (BufferSize > interleaved->TempSize) - { - interleaved->TempBuffer = _aligned_realloc(interleaved->TempBuffer, BufferSize, 16); - interleaved->TempSize = BufferSize; - } - - if (!interleaved->TempBuffer) - return -1; - - RleDecompress24to24(pSrcData, SrcSize, interleaved->TempBuffer, scanline, nWidth, nHeight); - - status = freerdp_image_copy(pDstData, DstFormat, nDstStep, nXDst, nYDst, - nWidth, nHeight, interleaved->TempBuffer, - SrcFormat, scanline, 0, 0, palette); - } - else if ((bpp == 16) || (bpp == 15)) - { + SrcFormat = PIXEL_FORMAT_RGB24_VF; + break; + case 16: scanline = nWidth * 2; - BufferSize = scanline * nHeight; - - SrcFormat = (bpp == 16) ? PIXEL_FORMAT_RGB16_VF : PIXEL_FORMAT_RGB15_VF; - - if (BufferSize > interleaved->TempSize) - { - interleaved->TempBuffer = _aligned_realloc(interleaved->TempBuffer, BufferSize, 16); - interleaved->TempSize = BufferSize; - } - - if (!interleaved->TempBuffer) - return -1; - - RleDecompress16to16(pSrcData, SrcSize, interleaved->TempBuffer, scanline, nWidth, nHeight); - - status = freerdp_image_copy(pDstData, DstFormat, nDstStep, - nXDst, nYDst, nWidth, nHeight, - interleaved->TempBuffer, SrcFormat, - scanline, 0, 0, palette); - } - else if (bpp == 8) - { + SrcFormat = PIXEL_FORMAT_RGB16_VF; + break; + case 15: + scanline = nWidth * 2; + SrcFormat = PIXEL_FORMAT_RGB15_VF; + break; + case 8: scanline = nWidth; - BufferSize = scanline * nHeight; - SrcFormat = PIXEL_FORMAT_RGB8_VF; - - if (BufferSize > interleaved->TempSize) - { - interleaved->TempBuffer = _aligned_realloc(interleaved->TempBuffer, BufferSize, 16); - interleaved->TempSize = BufferSize; - } - - if (!interleaved->TempBuffer) - return -1; - - RleDecompress8to8(pSrcData, SrcSize, interleaved->TempBuffer, scanline, nWidth, nHeight); - - status = freerdp_image_copy(pDstData, DstFormat, nDstStep, nXDst, nYDst, - nWidth, nHeight, interleaved->TempBuffer, - SrcFormat, scanline, 0, 0, palette); - } - else - { + break; + default: + WLog_ERR(TAG, "Invalid color depth %d", bpp); return -1; } - return 1; + BufferSize = scanline * nHeight; + if (BufferSize > interleaved->TempSize) + { + interleaved->TempBuffer = _aligned_realloc( + interleaved->TempBuffer, + BufferSize, 16); + interleaved->TempSize = BufferSize; + } + + if (!interleaved->TempBuffer) + return -1; + + switch(bpp) + { + case 24: + RleDecompress24to24(pSrcData, SrcSize, interleaved->TempBuffer, + scanline, nWidth, nHeight); + break; + case 16: + case 15: + RleDecompress16to16(pSrcData, SrcSize, interleaved->TempBuffer, + scanline, nWidth, nHeight); + break; + case 8: + RleDecompress8to8(pSrcData, SrcSize, interleaved->TempBuffer, + scanline, nWidth, nHeight); + break; + default: + return -1; + } + + status = freerdp_image_copy(pDstData, DstFormat, nDstStep, nXDst, nYDst, + nWidth, nHeight, interleaved->TempBuffer, + SrcFormat, scanline, 0, 0, palette); + + return status; } BOOL interleaved_compress(BITMAP_INTERLEAVED_CONTEXT* interleaved, - BYTE* pDstData, UINT32* pDstSize, - UINT32 nWidth, UINT32 nHeight, - const BYTE* pSrcData, UINT32 SrcFormat, - UINT32 nSrcStep, UINT32 nXSrc, UINT32 nYSrc, - const UINT32* palette, UINT32 bpp) + BYTE* pDstData, UINT32* pDstSize, + UINT32 nWidth, UINT32 nHeight, + const BYTE* pSrcData, UINT32 SrcFormat, + UINT32 nSrcStep, UINT32 nXSrc, UINT32 nYSrc, + const UINT32* palette, UINT32 bpp) { int status; wStream* s; @@ -382,7 +368,7 @@ BOOL interleaved_compress(BITMAP_INTERLEAVED_CONTEXT* interleaved, return FALSE; status = freerdp_image_copy(interleaved->TempBuffer, DstFormat, -1, 0, 0, nWidth, nHeight, - pSrcData, SrcFormat, nSrcStep, nXSrc, nYSrc, palette); + pSrcData, SrcFormat, nSrcStep, nXSrc, nYSrc, palette); s = Stream_New(pDstData, maxSize); @@ -390,7 +376,7 @@ BOOL interleaved_compress(BITMAP_INTERLEAVED_CONTEXT* interleaved, return FALSE; status = freerdp_bitmap_compress((char*) interleaved->TempBuffer, nWidth, nHeight, - s, bpp, maxSize, nHeight - 1, interleaved->bts, 0); + s, bpp, maxSize, nHeight - 1, interleaved->bts, 0); Stream_SealLength(s); *pDstSize = (UINT32) Stream_Length(s); diff --git a/libfreerdp/core/graphics.c b/libfreerdp/core/graphics.c index b95cccd7d..8074fcc05 100644 --- a/libfreerdp/core/graphics.c +++ b/libfreerdp/core/graphics.c @@ -57,7 +57,6 @@ void Bitmap_Free(rdpContext* context, rdpBitmap* bitmap) if (bitmap->data) _aligned_free(bitmap->data); - memset(bitmap, 0, sizeof(rdpBitmap)); free(bitmap); } } diff --git a/libfreerdp/gdi/gdi.c b/libfreerdp/gdi/gdi.c index 5a47ab100..6ed2712cb 100644 --- a/libfreerdp/gdi/gdi.c +++ b/libfreerdp/gdi/gdi.c @@ -509,8 +509,8 @@ static BOOL gdi_bitmap_update(rdpContext* context, { if (bitsPerPixel < 32) { - if (!freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_INTERLEAVED, - gdi->width, gdi->height)) + if (!freerdp_client_codecs_prepare( + codecs, FREERDP_CODEC_INTERLEAVED)) return FALSE; status = interleaved_decompress(codecs->interleaved, @@ -524,8 +524,8 @@ static BOOL gdi_bitmap_update(rdpContext* context, } else { - if (!freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_PLANAR, - gdi->width, gdi->height)) + if (!freerdp_client_codecs_prepare( + codecs, FREERDP_CODEC_PLANAR)) return FALSE; status = planar_decompress(codecs->planar, pSrcData, SrcSize, &gdi->bitmap_buffer, @@ -1087,8 +1087,7 @@ static BOOL gdi_surface_bits(rdpContext* context, { case RDP_CODEC_ID_REMOTEFX: { - if (!freerdp_client_codecs_prepare(gdi->codecs, FREERDP_CODEC_REMOTEFX, - gdi->width, gdi->height)) + if (!freerdp_client_codecs_prepare(gdi->codecs, FREERDP_CODEC_REMOTEFX)) return FALSE; pDstData = gdi->bitmap_buffer; @@ -1106,8 +1105,7 @@ static BOOL gdi_surface_bits(rdpContext* context, break; case RDP_CODEC_ID_NSCODEC: { - if (!freerdp_client_codecs_prepare(gdi->codecs, FREERDP_CODEC_NSCODEC, - gdi->width, gdi->height)) + if (!freerdp_client_codecs_prepare(gdi->codecs, FREERDP_CODEC_NSCODEC)) return FALSE; if (!nsc_process_message(gdi->codecs->nsc, cmd->bpp, cmd->width,