Clear codec internal format: keep API compatible
authorArmin Novak <armin.novak@thincast.com>
Mon, 12 Dec 2016 16:04:41 +0000 (17:04 +0100)
committerArmin Novak <armin.novak@thincast.com>
Mon, 12 Dec 2016 16:04:41 +0000 (17:04 +0100)
include/freerdp/codec/clear.h
libfreerdp/codec/clear.c
libfreerdp/codec/test/TestFreeRDPCodecClear.c
libfreerdp/core/codecs.c

index ada8192..14d7e5e 100644 (file)
@@ -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
index 5ec31a9..e2a6d3c 100644 (file)
@@ -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);
 
index 98fdbc3..ad16033 100644 (file)
@@ -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;
index dc2d188..b07bbd3 100644 (file)
@@ -24,7 +24,6 @@
 #include "rdp.h"
 
 #include <freerdp/codecs.h>
-#include <freerdp/gdi/gdi.h>
 
 #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;