diff --git a/include/freerdp/codec/clear.h b/include/freerdp/codec/clear.h index ada819236..14d7e5e18 100644 --- a/include/freerdp/codec/clear.h +++ b/include/freerdp/codec/clear.h @@ -39,7 +39,7 @@ struct _CLEAR_GLYPH_ENTRY { UINT32 size; UINT32 count; - BYTE* pixels; + UINT32* pixels; }; typedef struct _CLEAR_GLYPH_ENTRY CLEAR_GLYPH_ENTRY; @@ -83,7 +83,7 @@ FREERDP_API INT32 clear_decompress(CLEAR_CONTEXT* clear, const BYTE* pSrcData, FREERDP_API BOOL clear_context_reset(CLEAR_CONTEXT* clear); -FREERDP_API CLEAR_CONTEXT* clear_context_new(BOOL Compressor, UINT32 format); +FREERDP_API CLEAR_CONTEXT* clear_context_new(BOOL Compressor); FREERDP_API void clear_context_free(CLEAR_CONTEXT* clear); #ifdef __cplusplus diff --git a/libfreerdp/codec/clear.c b/libfreerdp/codec/clear.c index 5ec31a9b4..e2a6d3c0f 100644 --- a/libfreerdp/codec/clear.c +++ b/libfreerdp/codec/clear.c @@ -974,7 +974,7 @@ static BOOL clear_decompress_glyph_data(CLEAR_CONTEXT* clear, return FALSE; } - glyphEntry->pixels = tmp; + glyphEntry->pixels = (UINT32*)tmp; } if (!glyphEntry->pixels) @@ -984,7 +984,7 @@ static BOOL clear_decompress_glyph_data(CLEAR_CONTEXT* clear, } if (ppGlyphData) - *ppGlyphData = glyphEntry->pixels; + *ppGlyphData = (BYTE*)glyphEntry->pixels; return TRUE; } @@ -992,6 +992,15 @@ static BOOL clear_decompress_glyph_data(CLEAR_CONTEXT* clear, return TRUE; } +static INLINE BOOL updateContextFormat(CLEAR_CONTEXT* clear, UINT32 DstFormat) +{ + if (!clear || !clear->nsc) + return FALSE; + + clear->format = DstFormat; + return nsc_context_set_pixel_format(clear->nsc, DstFormat); +} + INT32 clear_decompress(CLEAR_CONTEXT* clear, const BYTE* pSrcData, UINT32 SrcSize, UINT32 nWidth, UINT32 nHeight, BYTE* pDstData, UINT32 DstFormat, UINT32 nDstStep, @@ -1029,6 +1038,9 @@ INT32 clear_decompress(CLEAR_CONTEXT* clear, const BYTE* pSrcData, goto fail; } + if (!updateContextFormat(clear, DstFormat)) + goto fail; + Stream_Read_UINT8(s, glyphFlags); Stream_Read_UINT8(s, seqNumber); @@ -1140,7 +1152,7 @@ BOOL clear_context_reset(CLEAR_CONTEXT* clear) clear->ShortVBarStorageCursor = 0; return TRUE; } -CLEAR_CONTEXT* clear_context_new(BOOL Compressor, UINT32 format) +CLEAR_CONTEXT* clear_context_new(BOOL Compressor) { CLEAR_CONTEXT* clear; clear = (CLEAR_CONTEXT*) calloc(1, sizeof(CLEAR_CONTEXT)); @@ -1150,12 +1162,13 @@ CLEAR_CONTEXT* clear_context_new(BOOL Compressor, UINT32 format) clear->Compressor = Compressor; clear->nsc = nsc_context_new(); - clear->format = format; if (!clear->nsc) goto error_nsc; - nsc_context_set_pixel_format(clear->nsc, format); + if (!updateContextFormat(clear, PIXEL_FORMAT_BGRX32)) + goto error_nsc; + clear->TempSize = 512 * 512 * 4; clear->TempBuffer = (BYTE*) malloc(clear->TempSize); diff --git a/libfreerdp/codec/test/TestFreeRDPCodecClear.c b/libfreerdp/codec/test/TestFreeRDPCodecClear.c index 98fdbc3c9..ad1603373 100644 --- a/libfreerdp/codec/test/TestFreeRDPCodecClear.c +++ b/libfreerdp/codec/test/TestFreeRDPCodecClear.c @@ -43,7 +43,7 @@ static BOOL test_ClearDecompressExample(UINT32 nr, const BYTE* pSrcData, { int status; BYTE pDstData[16384]; - CLEAR_CONTEXT* clear = clear_context_new(FALSE, PIXEL_FORMAT_BGRA32); + CLEAR_CONTEXT* clear = clear_context_new(FALSE); if (!clear) return FALSE; diff --git a/libfreerdp/core/codecs.c b/libfreerdp/core/codecs.c index dc2d1884b..b07bbd36a 100644 --- a/libfreerdp/core/codecs.c +++ b/libfreerdp/core/codecs.c @@ -24,7 +24,6 @@ #include "rdp.h" #include -#include #define TAG FREERDP_TAG("core.codecs") @@ -69,9 +68,7 @@ BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, if ((flags & FREERDP_CODEC_CLEARCODEC) && !codecs->clear) { - const UINT32 format = codecs->context->gdi->dstFormat; - - if (!(codecs->clear = clear_context_new(FALSE, format))) + if (!(codecs->clear = clear_context_new(FALSE))) { WLog_ERR(TAG, "Failed to create clear codec context"); return FALSE;