From c229a1939de2f0dcaec77edb90330099584aba09 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Mon, 18 Jul 2016 11:16:36 +0200 Subject: [PATCH] Updated codec API, unified drawing order color decoding. --- client/X11/xf_gdi.c | 75 +++-- client/X11/xf_graphics.c | 31 +- libfreerdp/cache/glyph.c | 20 +- libfreerdp/codec/include/bitmap.c | 472 +++++++++++++++++------------- libfreerdp/core/orders.c | 240 ++++++--------- libfreerdp/gdi/gdi.c | 134 +++++---- libfreerdp/gdi/gfx.c | 20 +- libfreerdp/gdi/graphics.c | 35 +-- 8 files changed, 533 insertions(+), 494 deletions(-) diff --git a/client/X11/xf_gdi.c b/client/X11/xf_gdi.c index 9373fdaa9..fdca10de2 100644 --- a/client/X11/xf_gdi.c +++ b/client/X11/xf_gdi.c @@ -318,7 +318,6 @@ Pixmap xf_mono_bitmap_new(xfContext* xfc, int width, int height, BYTE* data) BOOL xf_gdi_bitmap_update(rdpContext* context, const BITMAP_UPDATE* bitmapUpdate) { - int status; int nXDst; int nYDst; int nXSrc; @@ -359,25 +358,21 @@ BOOL xf_gdi_bitmap_update(rdpContext* context, if (bitsPerPixel < 32) { - status = interleaved_decompress(codecs->interleaved, - pSrcData, SrcSize, - bitsPerPixel, - pDstData, - xfc->format, -1, - 0, 0, - nWidth, nHeight, - &xfc->context.gdi->palette); + if (!interleaved_decompress(codecs->interleaved, + pSrcData, SrcSize, + bitsPerPixel, + pDstData, + xfc->format, -1, + 0, 0, + nWidth, nHeight, + &xfc->context.gdi->palette)) + return FALSE; } else { - status = planar_decompress(codecs->planar, pSrcData, SrcSize, pDstData, - xfc->format, -1, 0, 0, nWidth, nHeight, TRUE); - } - - if (status < 0) - { - WLog_ERR(TAG, "bitmap decompression failure"); - return FALSE; + if (!planar_decompress(codecs->planar, pSrcData, SrcSize, pDstData, + xfc->format, -1, 0, 0, nWidth, nHeight, TRUE)) + return FALSE; } pSrcData = xfc->bitmap_buffer; @@ -385,9 +380,12 @@ BOOL xf_gdi_bitmap_update(rdpContext* context, else { pDstData = xfc->bitmap_buffer; - status = freerdp_image_copy(pDstData, xfc->format, -1, 0, 0, - nWidth, nHeight, pSrcData, SrcFormat, - -1, 0, 0, &xfc->context.gdi->palette); + + if (!freerdp_image_copy(pDstData, xfc->format, -1, 0, 0, + nWidth, nHeight, pSrcData, SrcFormat, + -1, 0, 0, &xfc->context.gdi->palette)) + return FALSE; + pSrcData = xfc->bitmap_buffer; } @@ -582,10 +580,24 @@ static BOOL xf_gdi_opaque_rect(rdpContext* context, const OPAQUE_RECT_ORDER* opaque_rect) { UINT32 color; + rdpGdi* gdi = context->gdi; xfContext* xfc = (xfContext*) context; BOOL ret = TRUE; + UINT32 SrcFormat = gdi_get_pixel_format(context->settings->ColorDepth, FALSE); xf_lock_x11(xfc, FALSE); - color = xf_convert_rdp_order_color(xfc, opaque_rect->color); + + if (GetBitsPerPixel(SrcFormat) > 8) + { + SrcFormat = PIXEL_FORMAT_RGB24; + color = GetColor(SrcFormat, + opaque_rect->color & 0xFF, + (opaque_rect->color >> 8) & 0xFF, + (opaque_rect->color >> 16) & 0xFF, + 0xFF); + } + + color = ConvertColor(opaque_rect->color, SrcFormat, + gdi->drawing->hdc->format, &gdi->palette); XSetFunction(xfc->display, xfc->gc, GXcopy); XSetFillStyle(xfc->display, xfc->gc, FillSolid); XSetForeground(xfc->display, xfc->gc, color); @@ -606,19 +618,32 @@ static BOOL xf_gdi_multi_opaque_rect(rdpContext* context, const MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect) { UINT32 i; - UINT32 color; - const DELTA_RECT* rectangle; xfContext* xfc = (xfContext*) context; BOOL ret = TRUE; + rdpGdi* gdi = context->gdi; + UINT32 color; + UINT32 SrcFormat = gdi_get_pixel_format(context->settings->ColorDepth, FALSE); + + if (GetBitsPerPixel(SrcFormat) > 8) + { + SrcFormat = PIXEL_FORMAT_RGB24; + color = GetColor(SrcFormat, + multi_opaque_rect->color & 0xFF, + (multi_opaque_rect->color >> 8) & 0xFF, + (multi_opaque_rect->color >> 16) & 0xFF, + 0xFF); + } + + color = ConvertColor(multi_opaque_rect->color, SrcFormat, + gdi->drawing->hdc->format, &gdi->palette); xf_lock_x11(xfc, FALSE); - color = xf_convert_rdp_order_color(xfc, multi_opaque_rect->color); XSetFunction(xfc->display, xfc->gc, GXcopy); XSetFillStyle(xfc->display, xfc->gc, FillSolid); XSetForeground(xfc->display, xfc->gc, color); for (i = 1; i < multi_opaque_rect->numRectangles + 1; i++) { - rectangle = &multi_opaque_rect->rectangles[i]; + const DELTA_RECT* rectangle = &multi_opaque_rect->rectangles[i]; XFillRectangle(xfc->display, xfc->drawing, xfc->gc, rectangle->left, rectangle->top, rectangle->width, rectangle->height); diff --git a/client/X11/xf_graphics.c b/client/X11/xf_graphics.c index 022a0ab89..f6f2192ce 100644 --- a/client/X11/xf_graphics.c +++ b/client/X11/xf_graphics.c @@ -128,7 +128,6 @@ static BOOL xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, const BYTE* data, UINT32 width, UINT32 height, UINT32 bpp, UINT32 length, BOOL compressed, UINT32 codecId) { - int status; UINT16 size; const BYTE* pSrcData; BYTE* pDstData; @@ -151,30 +150,28 @@ static BOOL xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, { if (bpp < 32) { - status = interleaved_decompress(context->codecs->interleaved, - pSrcData, SrcSize, bpp, - pDstData, xfc->format, - -1, 0, 0, width, height, - &context->gdi->palette); + if (!interleaved_decompress(context->codecs->interleaved, + pSrcData, SrcSize, bpp, + pDstData, xfc->format, + -1, 0, 0, width, height, + &context->gdi->palette)) + return FALSE; } else { - status = planar_decompress(context->codecs->planar, pSrcData, SrcSize, - pDstData, xfc->format, -1, 0, 0, width, height, TRUE); - } - - if (status < 0) - { - WLog_ERR(TAG, "Bitmap Decompression Failed"); - return FALSE; + if (!planar_decompress(context->codecs->planar, pSrcData, SrcSize, + pDstData, xfc->format, -1, 0, 0, width, height, TRUE)) + return FALSE; } } else { SrcFormat = gdi_get_pixel_format(bpp, TRUE); - status = freerdp_image_copy(pDstData, xfc->format, -1, 0, 0, - width, height, pSrcData, - SrcFormat, -1, 0, 0, &context->gdi->palette); + + if (!freerdp_image_copy(pDstData, xfc->format, -1, 0, 0, + width, height, pSrcData, + SrcFormat, -1, 0, 0, &context->gdi->palette)) + return FALSE; } bitmap->compressed = FALSE; diff --git a/libfreerdp/cache/glyph.c b/libfreerdp/cache/glyph.c index bbe0fd7b9..33e789f80 100644 --- a/libfreerdp/cache/glyph.c +++ b/libfreerdp/cache/glyph.c @@ -35,7 +35,7 @@ static rdpGlyph* glyph_cache_get(rdpGlyphCache* glyph_cache, UINT32 id, UINT32 index); -static void glyph_cache_put(rdpGlyphCache* glyph_cache, UINT32 id, UINT32 index, +static BOOL glyph_cache_put(rdpGlyphCache* glyph_cache, UINT32 id, UINT32 index, rdpGlyph* entry); static void* glyph_cache_fragment_get(rdpGlyphCache* glyph, UINT32 index, @@ -434,12 +434,11 @@ static BOOL update_gdi_cache_glyph_v2(rdpContext* context, { UINT32 i; rdpGlyph* glyph; - const GLYPH_DATA_V2* glyphData; rdpCache* cache = context->cache; for (i = 0; i < cacheGlyphV2->cGlyphs; i++) { - glyphData = &cacheGlyphV2->glyphData[i]; + const GLYPH_DATA_V2* glyphData = &cacheGlyphV2->glyphData[i]; glyph = Glyph_Alloc(context); if (!glyph) @@ -454,7 +453,13 @@ static BOOL update_gdi_cache_glyph_v2(rdpContext* context, glyph->cy = glyphData->cy; glyph->cb = glyphData->cb; glyph->aj = glyphData->aj; - Glyph_New(context, glyph); + + if (!Glyph_New(context, glyph)) + { + Glyph_Free(context, glyph); + return FALSE; + } + glyph_cache_put(cache->glyph, cacheGlyphV2->cacheId, glyphData->cacheIndex, glyph); } @@ -487,7 +492,7 @@ rdpGlyph* glyph_cache_get(rdpGlyphCache* glyphCache, UINT32 id, UINT32 index) return glyph; } -void glyph_cache_put(rdpGlyphCache* glyphCache, UINT32 id, UINT32 index, +BOOL glyph_cache_put(rdpGlyphCache* glyphCache, UINT32 id, UINT32 index, rdpGlyph* glyph) { rdpGlyph* prevGlyph; @@ -495,13 +500,13 @@ void glyph_cache_put(rdpGlyphCache* glyphCache, UINT32 id, UINT32 index, if (id > 9) { WLog_ERR(TAG, "invalid glyph cache id: %d", id); - return; + return FALSE; } if (index > glyphCache->glyphCache[id].number) { WLog_ERR(TAG, "invalid glyph cache index: %d in cache id: %d", index, id); - return; + return FALSE; } WLog_DBG(TAG, "GlyphCachePut: id: %d index: %d", id, index); @@ -515,6 +520,7 @@ void glyph_cache_put(rdpGlyphCache* glyphCache, UINT32 id, UINT32 index, } glyphCache->glyphCache[id].entries[index] = glyph; + return TRUE; } void* glyph_cache_fragment_get(rdpGlyphCache* glyphCache, UINT32 index, diff --git a/libfreerdp/codec/include/bitmap.c b/libfreerdp/codec/include/bitmap.c index 7625b3a07..f262171de 100644 --- a/libfreerdp/codec/include/bitmap.c +++ b/libfreerdp/codec/include/bitmap.c @@ -25,11 +25,11 @@ * Write a foreground/background image to a destination buffer. */ static BYTE* WRITEFGBGIMAGE(BYTE* pbDest, UINT32 rowDelta, - BYTE bitmask, PIXEL fgPel, INT32 cBits) + BYTE bitmask, PIXEL fgPel, INT32 cBits) { PIXEL xorPixel; - DESTREADPIXEL(xorPixel, pbDest - rowDelta); + if (bitmask & g_MaskBit0) { DESTWRITEPIXEL(pbDest, xorPixel ^ fgPel); @@ -38,11 +38,14 @@ static BYTE* WRITEFGBGIMAGE(BYTE* pbDest, UINT32 rowDelta, { DESTWRITEPIXEL(pbDest, xorPixel); } + DESTNEXTPIXEL(pbDest); cBits = cBits - 1; + if (cBits > 0) { DESTREADPIXEL(xorPixel, pbDest - rowDelta); + if (bitmask & g_MaskBit1) { DESTWRITEPIXEL(pbDest, xorPixel ^ fgPel); @@ -51,11 +54,14 @@ static BYTE* WRITEFGBGIMAGE(BYTE* pbDest, UINT32 rowDelta, { DESTWRITEPIXEL(pbDest, xorPixel); } + DESTNEXTPIXEL(pbDest); cBits = cBits - 1; + if (cBits > 0) { DESTREADPIXEL(xorPixel, pbDest - rowDelta); + if (bitmask & g_MaskBit2) { DESTWRITEPIXEL(pbDest, xorPixel ^ fgPel); @@ -64,11 +70,14 @@ static BYTE* WRITEFGBGIMAGE(BYTE* pbDest, UINT32 rowDelta, { DESTWRITEPIXEL(pbDest, xorPixel); } + DESTNEXTPIXEL(pbDest); cBits = cBits - 1; + if (cBits > 0) { DESTREADPIXEL(xorPixel, pbDest - rowDelta); + if (bitmask & g_MaskBit3) { DESTWRITEPIXEL(pbDest, xorPixel ^ fgPel); @@ -77,11 +86,14 @@ static BYTE* WRITEFGBGIMAGE(BYTE* pbDest, UINT32 rowDelta, { DESTWRITEPIXEL(pbDest, xorPixel); } + DESTNEXTPIXEL(pbDest); cBits = cBits - 1; + if (cBits > 0) { DESTREADPIXEL(xorPixel, pbDest - rowDelta); + if (bitmask & g_MaskBit4) { DESTWRITEPIXEL(pbDest, xorPixel ^ fgPel); @@ -90,11 +102,14 @@ static BYTE* WRITEFGBGIMAGE(BYTE* pbDest, UINT32 rowDelta, { DESTWRITEPIXEL(pbDest, xorPixel); } + DESTNEXTPIXEL(pbDest); cBits = cBits - 1; + if (cBits > 0) { DESTREADPIXEL(xorPixel, pbDest - rowDelta); + if (bitmask & g_MaskBit5) { DESTWRITEPIXEL(pbDest, xorPixel ^ fgPel); @@ -103,11 +118,14 @@ static BYTE* WRITEFGBGIMAGE(BYTE* pbDest, UINT32 rowDelta, { DESTWRITEPIXEL(pbDest, xorPixel); } + DESTNEXTPIXEL(pbDest); cBits = cBits - 1; + if (cBits > 0) { DESTREADPIXEL(xorPixel, pbDest - rowDelta); + if (bitmask & g_MaskBit6) { DESTWRITEPIXEL(pbDest, xorPixel ^ fgPel); @@ -116,11 +134,14 @@ static BYTE* WRITEFGBGIMAGE(BYTE* pbDest, UINT32 rowDelta, { DESTWRITEPIXEL(pbDest, xorPixel); } + DESTNEXTPIXEL(pbDest); cBits = cBits - 1; + if (cBits > 0) { DESTREADPIXEL(xorPixel, pbDest - rowDelta); + if (bitmask & g_MaskBit7) { DESTWRITEPIXEL(pbDest, xorPixel ^ fgPel); @@ -129,6 +150,7 @@ static BYTE* WRITEFGBGIMAGE(BYTE* pbDest, UINT32 rowDelta, { DESTWRITEPIXEL(pbDest, xorPixel); } + DESTNEXTPIXEL(pbDest); } } @@ -137,6 +159,7 @@ static BYTE* WRITEFGBGIMAGE(BYTE* pbDest, UINT32 rowDelta, } } } + return pbDest; } @@ -145,7 +168,7 @@ static BYTE* WRITEFGBGIMAGE(BYTE* pbDest, UINT32 rowDelta, * for the first line of compressed data. */ static BYTE* WRITEFIRSTLINEFGBGIMAGE(BYTE* pbDest, BYTE bitmask, - PIXEL fgPel, UINT32 cBits) + PIXEL fgPel, UINT32 cBits) { if (bitmask & g_MaskBit0) { @@ -155,8 +178,10 @@ static BYTE* WRITEFIRSTLINEFGBGIMAGE(BYTE* pbDest, BYTE bitmask, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); } + DESTNEXTPIXEL(pbDest); cBits = cBits - 1; + if (cBits > 0) { if (bitmask & g_MaskBit1) @@ -167,8 +192,10 @@ static BYTE* WRITEFIRSTLINEFGBGIMAGE(BYTE* pbDest, BYTE bitmask, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); } + DESTNEXTPIXEL(pbDest); cBits = cBits - 1; + if (cBits > 0) { if (bitmask & g_MaskBit2) @@ -179,8 +206,10 @@ static BYTE* WRITEFIRSTLINEFGBGIMAGE(BYTE* pbDest, BYTE bitmask, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); } + DESTNEXTPIXEL(pbDest); cBits = cBits - 1; + if (cBits > 0) { if (bitmask & g_MaskBit3) @@ -191,8 +220,10 @@ static BYTE* WRITEFIRSTLINEFGBGIMAGE(BYTE* pbDest, BYTE bitmask, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); } + DESTNEXTPIXEL(pbDest); cBits = cBits - 1; + if (cBits > 0) { if (bitmask & g_MaskBit4) @@ -203,8 +234,10 @@ static BYTE* WRITEFIRSTLINEFGBGIMAGE(BYTE* pbDest, BYTE bitmask, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); } + DESTNEXTPIXEL(pbDest); cBits = cBits - 1; + if (cBits > 0) { if (bitmask & g_MaskBit5) @@ -215,8 +248,10 @@ static BYTE* WRITEFIRSTLINEFGBGIMAGE(BYTE* pbDest, BYTE bitmask, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); } + DESTNEXTPIXEL(pbDest); cBits = cBits - 1; + if (cBits > 0) { if (bitmask & g_MaskBit6) @@ -227,8 +262,10 @@ static BYTE* WRITEFIRSTLINEFGBGIMAGE(BYTE* pbDest, BYTE bitmask, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); } + DESTNEXTPIXEL(pbDest); cBits = cBits - 1; + if (cBits > 0) { if (bitmask & g_MaskBit7) @@ -239,6 +276,7 @@ static BYTE* WRITEFIRSTLINEFGBGIMAGE(BYTE* pbDest, BYTE bitmask, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); } + DESTNEXTPIXEL(pbDest); } } @@ -247,32 +285,29 @@ static BYTE* WRITEFIRSTLINEFGBGIMAGE(BYTE* pbDest, BYTE bitmask, } } } + return pbDest; } /** * Decompress an RLE compressed bitmap. */ -void RLEDECOMPRESS(const BYTE* pbSrcBuffer, UINT32 cbSrcBuffer, BYTE* pbDestBuffer, - UINT32 rowDelta, UINT32 width, UINT32 height) +static void RLEDECOMPRESS(const BYTE* pbSrcBuffer, UINT32 cbSrcBuffer, + BYTE* pbDestBuffer, + UINT32 rowDelta, UINT32 width, UINT32 height) { const BYTE* pbSrc = pbSrcBuffer; const BYTE* pbEnd = pbSrcBuffer + cbSrcBuffer; BYTE* pbDest = pbDestBuffer; - PIXEL temp; PIXEL fgPel = WHITE_PIXEL; BOOL fInsertFgPel = FALSE; BOOL fFirstLine = TRUE; - BYTE bitmask; PIXEL pixelA, pixelB; - UINT32 runLength; UINT32 code; - UINT32 advance; - RLEEXTRA while (pbSrc < pbEnd) @@ -298,6 +333,7 @@ void RLEDECOMPRESS(const BYTE* pbSrcBuffer, UINT32 cbSrcBuffer, BYTE* pbDestBuff { runLength = ExtractRunLength(code, pbSrc, &advance); pbSrc = pbSrc + advance; + if (fFirstLine) { if (fInsertFgPel) @@ -306,13 +342,15 @@ void RLEDECOMPRESS(const BYTE* pbSrcBuffer, UINT32 cbSrcBuffer, BYTE* pbDestBuff DESTNEXTPIXEL(pbDest); runLength = runLength - 1; } + while (runLength >= UNROLL_COUNT) { UNROLL( - DESTWRITEPIXEL(pbDest, BLACK_PIXEL); - DESTNEXTPIXEL(pbDest); ); + DESTWRITEPIXEL(pbDest, BLACK_PIXEL); + DESTNEXTPIXEL(pbDest);); runLength = runLength - UNROLL_COUNT; } + while (runLength > 0) { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); @@ -329,14 +367,16 @@ void RLEDECOMPRESS(const BYTE* pbSrcBuffer, UINT32 cbSrcBuffer, BYTE* pbDestBuff DESTNEXTPIXEL(pbDest); runLength = runLength - 1; } + while (runLength >= UNROLL_COUNT) { UNROLL( - DESTREADPIXEL(temp, pbDest - rowDelta); - DESTWRITEPIXEL(pbDest, temp); - DESTNEXTPIXEL(pbDest); ); + DESTREADPIXEL(temp, pbDest - rowDelta); + DESTWRITEPIXEL(pbDest, temp); + DESTNEXTPIXEL(pbDest);); runLength = runLength - UNROLL_COUNT; } + while (runLength > 0) { DESTREADPIXEL(temp, pbDest - rowDelta); @@ -345,6 +385,7 @@ void RLEDECOMPRESS(const BYTE* pbSrcBuffer, UINT32 cbSrcBuffer, BYTE* pbDestBuff runLength = runLength - 1; } } + /* A follow-on background run order will need a foreground pel inserted. */ fInsertFgPel = TRUE; continue; @@ -356,214 +397,237 @@ void RLEDECOMPRESS(const BYTE* pbSrcBuffer, UINT32 cbSrcBuffer, BYTE* pbDestBuff switch (code) { - /* Handle Foreground Run Orders. */ - case REGULAR_FG_RUN: - case MEGA_MEGA_FG_RUN: - case LITE_SET_FG_FG_RUN: - case MEGA_MEGA_SET_FG_RUN: - runLength = ExtractRunLength(code, pbSrc, &advance); - pbSrc = pbSrc + advance; - if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN) - { - SRCREADPIXEL(fgPel, pbSrc); - SRCNEXTPIXEL(pbSrc); - } - if (fFirstLine) - { - while (runLength >= UNROLL_COUNT) - { - UNROLL( - DESTWRITEPIXEL(pbDest, fgPel); - DESTNEXTPIXEL(pbDest); ); - runLength = runLength - UNROLL_COUNT; - } - while (runLength > 0) - { - DESTWRITEPIXEL(pbDest, fgPel); - DESTNEXTPIXEL(pbDest); - runLength = runLength - 1; - } - } - else - { - while (runLength >= UNROLL_COUNT) - { - UNROLL( - DESTREADPIXEL(temp, pbDest - rowDelta); - DESTWRITEPIXEL(pbDest, temp ^ fgPel); - DESTNEXTPIXEL(pbDest); ); - runLength = runLength - UNROLL_COUNT; - } - while (runLength > 0) - { - DESTREADPIXEL(temp, pbDest - rowDelta); - DESTWRITEPIXEL(pbDest, temp ^ fgPel); - DESTNEXTPIXEL(pbDest); - runLength = runLength - 1; - } - } - break; + /* Handle Foreground Run Orders. */ + case REGULAR_FG_RUN: + case MEGA_MEGA_FG_RUN: + case LITE_SET_FG_FG_RUN: + case MEGA_MEGA_SET_FG_RUN: + runLength = ExtractRunLength(code, pbSrc, &advance); + pbSrc = pbSrc + advance; - /* Handle Dithered Run Orders. */ - case LITE_DITHERED_RUN: - case MEGA_MEGA_DITHERED_RUN: - runLength = ExtractRunLength(code, pbSrc, &advance); - pbSrc = pbSrc + advance; - SRCREADPIXEL(pixelA, pbSrc); - SRCNEXTPIXEL(pbSrc); - SRCREADPIXEL(pixelB, pbSrc); - SRCNEXTPIXEL(pbSrc); - while (runLength >= UNROLL_COUNT) - { - UNROLL( - DESTWRITEPIXEL(pbDest, pixelA); - DESTNEXTPIXEL(pbDest); - DESTWRITEPIXEL(pbDest, pixelB); - DESTNEXTPIXEL(pbDest); ); - runLength = runLength - UNROLL_COUNT; - } - while (runLength > 0) - { - DESTWRITEPIXEL(pbDest, pixelA); - DESTNEXTPIXEL(pbDest); - DESTWRITEPIXEL(pbDest, pixelB); - DESTNEXTPIXEL(pbDest); - runLength = runLength - 1; - } - break; - - /* Handle Color Run Orders. */ - case REGULAR_COLOR_RUN: - case MEGA_MEGA_COLOR_RUN: - runLength = ExtractRunLength(code, pbSrc, &advance); - pbSrc = pbSrc + advance; - SRCREADPIXEL(pixelA, pbSrc); - SRCNEXTPIXEL(pbSrc); - while (runLength >= UNROLL_COUNT) - { - UNROLL( - DESTWRITEPIXEL(pbDest, pixelA); - DESTNEXTPIXEL(pbDest); ); - runLength = runLength - UNROLL_COUNT; - } - while (runLength > 0) - { - DESTWRITEPIXEL(pbDest, pixelA); - DESTNEXTPIXEL(pbDest); - runLength = runLength - 1; - } - break; - - /* Handle Foreground/Background Image Orders. */ - case REGULAR_FGBG_IMAGE: - case MEGA_MEGA_FGBG_IMAGE: - case LITE_SET_FG_FGBG_IMAGE: - case MEGA_MEGA_SET_FGBG_IMAGE: - runLength = ExtractRunLength(code, pbSrc, &advance); - pbSrc = pbSrc + advance; - if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE) - { - SRCREADPIXEL(fgPel, pbSrc); - SRCNEXTPIXEL(pbSrc); - } - if (fFirstLine) - { - while (runLength > 8) + if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN) { - bitmask = *pbSrc; - pbSrc = pbSrc + 1; - pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, bitmask, fgPel, 8); - runLength = runLength - 8; + SRCREADPIXEL(fgPel, pbSrc); + SRCNEXTPIXEL(pbSrc); } - } - else - { - while (runLength > 8) - { - bitmask = *pbSrc; - pbSrc = pbSrc + 1; - pbDest = WRITEFGBGIMAGE(pbDest, rowDelta, bitmask, fgPel, 8); - runLength = runLength - 8; - } - } - if (runLength > 0) - { - bitmask = *pbSrc; - pbSrc = pbSrc + 1; + if (fFirstLine) { - pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, bitmask, fgPel, runLength); + while (runLength >= UNROLL_COUNT) + { + UNROLL( + DESTWRITEPIXEL(pbDest, fgPel); + DESTNEXTPIXEL(pbDest);); + runLength = runLength - UNROLL_COUNT; + } + + while (runLength > 0) + { + DESTWRITEPIXEL(pbDest, fgPel); + DESTNEXTPIXEL(pbDest); + runLength = runLength - 1; + } } else { - pbDest = WRITEFGBGIMAGE(pbDest, rowDelta, bitmask, fgPel, runLength); + while (runLength >= UNROLL_COUNT) + { + UNROLL( + DESTREADPIXEL(temp, pbDest - rowDelta); + DESTWRITEPIXEL(pbDest, temp ^ fgPel); + DESTNEXTPIXEL(pbDest);); + runLength = runLength - UNROLL_COUNT; + } + + while (runLength > 0) + { + DESTREADPIXEL(temp, pbDest - rowDelta); + DESTWRITEPIXEL(pbDest, temp ^ fgPel); + DESTNEXTPIXEL(pbDest); + runLength = runLength - 1; + } } - } - break; + + break; + + /* Handle Dithered Run Orders. */ + case LITE_DITHERED_RUN: + case MEGA_MEGA_DITHERED_RUN: + runLength = ExtractRunLength(code, pbSrc, &advance); + pbSrc = pbSrc + advance; + SRCREADPIXEL(pixelA, pbSrc); + SRCNEXTPIXEL(pbSrc); + SRCREADPIXEL(pixelB, pbSrc); + SRCNEXTPIXEL(pbSrc); + + while (runLength >= UNROLL_COUNT) + { + UNROLL( + DESTWRITEPIXEL(pbDest, pixelA); + DESTNEXTPIXEL(pbDest); + DESTWRITEPIXEL(pbDest, pixelB); + DESTNEXTPIXEL(pbDest);); + runLength = runLength - UNROLL_COUNT; + } + + while (runLength > 0) + { + DESTWRITEPIXEL(pbDest, pixelA); + DESTNEXTPIXEL(pbDest); + DESTWRITEPIXEL(pbDest, pixelB); + DESTNEXTPIXEL(pbDest); + runLength = runLength - 1; + } + + break; + + /* Handle Color Run Orders. */ + case REGULAR_COLOR_RUN: + case MEGA_MEGA_COLOR_RUN: + runLength = ExtractRunLength(code, pbSrc, &advance); + pbSrc = pbSrc + advance; + SRCREADPIXEL(pixelA, pbSrc); + SRCNEXTPIXEL(pbSrc); + + while (runLength >= UNROLL_COUNT) + { + UNROLL( + DESTWRITEPIXEL(pbDest, pixelA); + DESTNEXTPIXEL(pbDest);); + runLength = runLength - UNROLL_COUNT; + } + + while (runLength > 0) + { + DESTWRITEPIXEL(pbDest, pixelA); + DESTNEXTPIXEL(pbDest); + runLength = runLength - 1; + } + + break; + + /* Handle Foreground/Background Image Orders. */ + case REGULAR_FGBG_IMAGE: + case MEGA_MEGA_FGBG_IMAGE: + case LITE_SET_FG_FGBG_IMAGE: + case MEGA_MEGA_SET_FGBG_IMAGE: + runLength = ExtractRunLength(code, pbSrc, &advance); + pbSrc = pbSrc + advance; + + if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE) + { + SRCREADPIXEL(fgPel, pbSrc); + SRCNEXTPIXEL(pbSrc); + } + + if (fFirstLine) + { + while (runLength > 8) + { + bitmask = *pbSrc; + pbSrc = pbSrc + 1; + pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, bitmask, fgPel, 8); + runLength = runLength - 8; + } + } + else + { + while (runLength > 8) + { + bitmask = *pbSrc; + pbSrc = pbSrc + 1; + pbDest = WRITEFGBGIMAGE(pbDest, rowDelta, bitmask, fgPel, 8); + runLength = runLength - 8; + } + } + + if (runLength > 0) + { + bitmask = *pbSrc; + pbSrc = pbSrc + 1; + + if (fFirstLine) + { + pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, bitmask, fgPel, runLength); + } + else + { + pbDest = WRITEFGBGIMAGE(pbDest, rowDelta, bitmask, fgPel, runLength); + } + } + + break; /* Handle Color Image Orders. */ - case REGULAR_COLOR_IMAGE: - case MEGA_MEGA_COLOR_IMAGE: - runLength = ExtractRunLength(code, pbSrc, &advance); - pbSrc = pbSrc + advance; - while (runLength >= UNROLL_COUNT) - { - UNROLL( - SRCREADPIXEL(temp, pbSrc); - SRCNEXTPIXEL(pbSrc); - DESTWRITEPIXEL(pbDest, temp); - DESTNEXTPIXEL(pbDest); ); - runLength = runLength - UNROLL_COUNT; - } - while (runLength > 0) - { - SRCREADPIXEL(temp, pbSrc); - SRCNEXTPIXEL(pbSrc); - DESTWRITEPIXEL(pbDest, temp); - DESTNEXTPIXEL(pbDest); - runLength = runLength - 1; - } - break; + case REGULAR_COLOR_IMAGE: + case MEGA_MEGA_COLOR_IMAGE: + runLength = ExtractRunLength(code, pbSrc, &advance); + pbSrc = pbSrc + advance; + + while (runLength >= UNROLL_COUNT) + { + UNROLL( + SRCREADPIXEL(temp, pbSrc); + SRCNEXTPIXEL(pbSrc); + DESTWRITEPIXEL(pbDest, temp); + DESTNEXTPIXEL(pbDest);); + runLength = runLength - UNROLL_COUNT; + } + + while (runLength > 0) + { + SRCREADPIXEL(temp, pbSrc); + SRCNEXTPIXEL(pbSrc); + DESTWRITEPIXEL(pbDest, temp); + DESTNEXTPIXEL(pbDest); + runLength = runLength - 1; + } + + break; /* Handle Special Order 1. */ - case SPECIAL_FGBG_1: - pbSrc = pbSrc + 1; - if (fFirstLine) - { - pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, g_MaskSpecialFgBg1, fgPel, 8); - } - else - { - pbDest = WRITEFGBGIMAGE(pbDest, rowDelta, g_MaskSpecialFgBg1, fgPel, 8); - } - break; + case SPECIAL_FGBG_1: + pbSrc = pbSrc + 1; + + if (fFirstLine) + { + pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, g_MaskSpecialFgBg1, fgPel, 8); + } + else + { + pbDest = WRITEFGBGIMAGE(pbDest, rowDelta, g_MaskSpecialFgBg1, fgPel, 8); + } + + break; /* Handle Special Order 2. */ - case SPECIAL_FGBG_2: - pbSrc = pbSrc + 1; - if (fFirstLine) - { - pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, g_MaskSpecialFgBg2, fgPel, 8); - } - else - { - pbDest = WRITEFGBGIMAGE(pbDest, rowDelta, g_MaskSpecialFgBg2, fgPel, 8); - } - break; + case SPECIAL_FGBG_2: + pbSrc = pbSrc + 1; + + if (fFirstLine) + { + pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, g_MaskSpecialFgBg2, fgPel, 8); + } + else + { + pbDest = WRITEFGBGIMAGE(pbDest, rowDelta, g_MaskSpecialFgBg2, fgPel, 8); + } + + break; /* Handle White Order. */ - case SPECIAL_WHITE: - pbSrc = pbSrc + 1; - DESTWRITEPIXEL(pbDest, WHITE_PIXEL); - DESTNEXTPIXEL(pbDest); - break; + case SPECIAL_WHITE: + pbSrc = pbSrc + 1; + DESTWRITEPIXEL(pbDest, WHITE_PIXEL); + DESTNEXTPIXEL(pbDest); + break; /* Handle Black Order. */ - case SPECIAL_BLACK: - pbSrc = pbSrc + 1; - DESTWRITEPIXEL(pbDest, BLACK_PIXEL); - DESTNEXTPIXEL(pbDest); - break; + case SPECIAL_BLACK: + pbSrc = pbSrc + 1; + DESTWRITEPIXEL(pbDest, BLACK_PIXEL); + DESTNEXTPIXEL(pbDest); + break; } } } diff --git a/libfreerdp/core/orders.c b/libfreerdp/core/orders.c index 4325347cc..8954a24dc 100644 --- a/libfreerdp/core/orders.c +++ b/libfreerdp/core/orders.c @@ -215,12 +215,13 @@ static INLINE BOOL update_read_color(wStream* s, UINT32* color) if (Stream_GetRemainingLength(s) < 3) return FALSE; + *color = 0; Stream_Read_UINT8(s, byte); - *color = (UINT32) byte << 16; + *color = (UINT32) byte; Stream_Read_UINT8(s, byte); - *color |= ((UINT32) byte << 8); + *color |= ((UINT32) byte << 8) & 0xFF00; Stream_Read_UINT8(s, byte); - *color |= (UINT32) byte; + *color |= ((UINT32) byte << 16) & 0xFF0000; return TRUE; } @@ -236,36 +237,35 @@ static INLINE BOOL update_write_color(wStream* s, UINT32 color) return TRUE; } -static INLINE void update_read_colorref(wStream* s, UINT32* color) +static INLINE BOOL update_read_colorref(wStream* s, UINT32* color) { BYTE byte; + + if (Stream_GetRemainingLength(s) < 4) + return FALSE; + + *color = 0; Stream_Read_UINT8(s, byte); *color = byte; Stream_Read_UINT8(s, byte); - *color |= (byte << 8); + *color |= ((UINT32)byte << 8); Stream_Read_UINT8(s, byte); - *color |= (byte << 16); + *color |= ((UINT32)byte << 16); Stream_Seek_UINT8(s); + return TRUE; } -static INLINE void update_read_color_quad(wStream* s, UINT32* color) +static INLINE BOOL update_read_color_quad(wStream* s, UINT32* color) { - BYTE byte; - Stream_Read_UINT8(s, byte); - *color = (byte << 16); - Stream_Read_UINT8(s, byte); - *color |= (byte << 8); - Stream_Read_UINT8(s, byte); - *color |= byte; - Stream_Seek_UINT8(s); + return update_read_colorref(s, color); } static INLINE void update_write_color_quad(wStream* s, UINT32 color) { BYTE byte; - byte = (color << 16) & 0xFF; + byte = (color >> 16) & 0xFF; Stream_Write_UINT8(s, byte); - byte = (color << 8) & 0xFF; + byte = (color >> 8) & 0xFF; Stream_Write_UINT8(s, byte); byte = color & 0xFF; Stream_Write_UINT8(s, byte); @@ -799,27 +799,36 @@ static INLINE BOOL update_read_delta_points(wStream* s, DELTA_POINT* points, return FALSE; \ } \ } while(0) -#define ORDER_FIELD_COLOR(NO, TARGET) \ - do { \ - if ((orderInfo->fieldFlags & (1 << (NO-1))) && !update_read_color(s, &TARGET)) { \ - WLog_ERR(TAG, "error reading %s", #TARGET); \ - return FALSE; \ - } \ - } while(0) +static INLINE BOOL ORDER_FIELD_COLOR(const ORDER_INFO* orderInfo, wStream* s, + UINT32 NO, UINT32* TARGET) +{ + if (!TARGET || !orderInfo) + return FALSE; -#define FIELD_SKIP_BUFFER16(s, TARGET_LEN) \ - do { \ - if (Stream_GetRemainingLength(s) < 2) {\ - WLog_ERR(TAG, "error reading length %s", #TARGET_LEN); \ - return FALSE; \ - }\ - Stream_Read_UINT16(s, TARGET_LEN); \ - if (!Stream_SafeSeek(s, TARGET_LEN)) { \ - WLog_ERR(TAG, "error skipping %d bytes", TARGET_LEN); \ - return FALSE; \ - } \ - } while(0) + *TARGET = 0; + + if ((orderInfo->fieldFlags & (1 << (NO - 1))) && !update_read_color(s, TARGET)) + return FALSE; + + return TRUE; +} + +static INLINE BOOL FIELD_SKIP_BUFFER16(wStream* s, UINT32 TARGET_LEN) +{ + if (Stream_GetRemainingLength(s) < 2) + return FALSE; + + Stream_Read_UINT16(s, TARGET_LEN); + + if (!Stream_SafeSeek(s, TARGET_LEN)) + { + WLog_ERR(TAG, "error skipping %d bytes", TARGET_LEN); + return FALSE; + } + + return TRUE; +} /* Primary Drawing Orders */ static BOOL update_read_dstblt_order(wStream* s, ORDER_INFO* orderInfo, @@ -832,13 +841,11 @@ static BOOL update_read_dstblt_order(wStream* s, ORDER_INFO* orderInfo, ORDER_FIELD_BYTE(5, dstblt->bRop); return TRUE; } - int update_approximate_dstblt_order(ORDER_INFO* orderInfo, const DSTBLT_ORDER* dstblt) { return 32; } - BOOL update_write_dstblt_order(wStream* s, ORDER_INFO* orderInfo, const DSTBLT_ORDER* dstblt) { @@ -859,7 +866,6 @@ BOOL update_write_dstblt_order(wStream* s, ORDER_INFO* orderInfo, Stream_Write_UINT8(s, dstblt->bRop); return TRUE; } - static BOOL update_read_patblt_order(wStream* s, ORDER_INFO* orderInfo, PATBLT_ORDER* patblt) { @@ -868,16 +874,15 @@ static BOOL update_read_patblt_order(wStream* s, ORDER_INFO* orderInfo, ORDER_FIELD_COORD(3, patblt->nWidth); ORDER_FIELD_COORD(4, patblt->nHeight); ORDER_FIELD_BYTE(5, patblt->bRop); - ORDER_FIELD_COLOR(6, patblt->backColor); - ORDER_FIELD_COLOR(7, patblt->foreColor); + ORDER_FIELD_COLOR(orderInfo, s, 6, &patblt->backColor); + ORDER_FIELD_COLOR(orderInfo, s, 7, &patblt->foreColor); return update_read_brush(s, &patblt->brush, orderInfo->fieldFlags >> 7); } - -int update_approximate_patblt_order(ORDER_INFO* orderInfo, PATBLT_ORDER* patblt) +int update_approximate_patblt_order(ORDER_INFO* orderInfo, + PATBLT_ORDER* patblt) { return 32; } - BOOL update_write_patblt_order(wStream* s, ORDER_INFO* orderInfo, PATBLT_ORDER* patblt) { @@ -908,7 +913,6 @@ BOOL update_write_patblt_order(wStream* s, ORDER_INFO* orderInfo, update_write_brush(s, &patblt->brush, orderInfo->fieldFlags >> 7); return TRUE; } - static BOOL update_read_scrblt_order(wStream* s, ORDER_INFO* orderInfo, SCRBLT_ORDER* scrblt) { @@ -921,13 +925,11 @@ static BOOL update_read_scrblt_order(wStream* s, ORDER_INFO* orderInfo, ORDER_FIELD_COORD(7, scrblt->nYSrc); return TRUE; } - int update_approximate_scrblt_order(ORDER_INFO* orderInfo, const SCRBLT_ORDER* scrblt) { return 32; } - BOOL update_write_scrblt_order(wStream* s, ORDER_INFO* orderInfo, const SCRBLT_ORDER* scrblt) { @@ -952,7 +954,6 @@ BOOL update_write_scrblt_order(wStream* s, ORDER_INFO* orderInfo, update_write_coord(s, scrblt->nYSrc); return TRUE; } - static BOOL update_read_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, OPAQUE_RECT_ORDER* opaque_rect) { @@ -968,7 +969,7 @@ static BOOL update_read_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, return FALSE; Stream_Read_UINT8(s, byte); - opaque_rect->color = (opaque_rect->color & 0xFF00FFFF) | ((UINT32) byte << 16); + opaque_rect->color = (opaque_rect->color & 0x00FFFF00) | ((UINT32) byte); } if (orderInfo->fieldFlags & ORDER_FIELD_06) @@ -977,7 +978,7 @@ static BOOL update_read_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, return FALSE; Stream_Read_UINT8(s, byte); - opaque_rect->color = (opaque_rect->color & 0xFFFF00FF) | ((UINT32) byte << 8); + opaque_rect->color = (opaque_rect->color & 0x00FF00FF) | ((UINT32) byte << 8); } if (orderInfo->fieldFlags & ORDER_FIELD_07) @@ -986,18 +987,16 @@ static BOOL update_read_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, return FALSE; Stream_Read_UINT8(s, byte); - opaque_rect->color = (opaque_rect->color & 0xFFFFFF00) | (UINT32) byte; + opaque_rect->color = (opaque_rect->color & 0x0000FFFF) | ((UINT32) byte << 16); } return TRUE; } - int update_approximate_opaque_rect_order(ORDER_INFO* orderInfo, const OPAQUE_RECT_ORDER* opaque_rect) { return 32; } - BOOL update_write_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, const OPAQUE_RECT_ORDER* opaque_rect) { @@ -1007,6 +1006,7 @@ BOOL update_write_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, if (!Stream_EnsureRemainingCapacity(s, inf)) return FALSE; + // TODO: Color format conversion orderInfo->fieldFlags = 0; orderInfo->fieldFlags |= ORDER_FIELD_01; update_write_coord(s, opaque_rect->nLeftRect); @@ -1027,8 +1027,8 @@ BOOL update_write_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, Stream_Write_UINT8(s, byte); return TRUE; } - -static BOOL update_read_draw_nine_grid_order(wStream* s, ORDER_INFO* orderInfo, +static BOOL update_read_draw_nine_grid_order(wStream* s, + ORDER_INFO* orderInfo, DRAW_NINE_GRID_ORDER* draw_nine_grid) { ORDER_FIELD_COORD(1, draw_nine_grid->srcLeft); @@ -1038,7 +1038,6 @@ static BOOL update_read_draw_nine_grid_order(wStream* s, ORDER_INFO* orderInfo, ORDER_FIELD_UINT16(5, draw_nine_grid->bitmapId); return TRUE; } - static BOOL update_read_multi_dstblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_DSTBLT_ORDER* multi_dstblt) { @@ -1061,7 +1060,6 @@ static BOOL update_read_multi_dstblt_order(wStream* s, ORDER_INFO* orderInfo, return TRUE; } - static BOOL update_read_multi_patblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_PATBLT_ORDER* multi_patblt) { @@ -1070,8 +1068,8 @@ static BOOL update_read_multi_patblt_order(wStream* s, ORDER_INFO* orderInfo, ORDER_FIELD_COORD(3, multi_patblt->nWidth); ORDER_FIELD_COORD(4, multi_patblt->nHeight); ORDER_FIELD_BYTE(5, multi_patblt->bRop); - ORDER_FIELD_COLOR(6, multi_patblt->backColor); - ORDER_FIELD_COLOR(7, multi_patblt->foreColor); + ORDER_FIELD_COLOR(orderInfo, s, 6, &multi_patblt->backColor); + ORDER_FIELD_COLOR(orderInfo, s, 7, &multi_patblt->foreColor); if (!update_read_brush(s, &multi_patblt->brush, orderInfo->fieldFlags >> 7)) return FALSE; @@ -1092,7 +1090,6 @@ static BOOL update_read_multi_patblt_order(wStream* s, ORDER_INFO* orderInfo, return TRUE; } - static BOOL update_read_multi_scrblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_SCRBLT_ORDER* multi_scrblt) { @@ -1117,7 +1114,6 @@ static BOOL update_read_multi_scrblt_order(wStream* s, ORDER_INFO* orderInfo, return TRUE; } - static BOOL update_read_multi_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect) @@ -1134,8 +1130,8 @@ static BOOL update_read_multi_opaque_rect_order(wStream* s, return FALSE; Stream_Read_UINT8(s, byte); - multi_opaque_rect->color = (multi_opaque_rect->color & 0xFF00FFFF) | (( - UINT32) byte << 16); + multi_opaque_rect->color = (multi_opaque_rect->color & 0x00FFFF00) | (( + UINT32) byte); } if (orderInfo->fieldFlags & ORDER_FIELD_06) @@ -1144,7 +1140,7 @@ static BOOL update_read_multi_opaque_rect_order(wStream* s, return FALSE; Stream_Read_UINT8(s, byte); - multi_opaque_rect->color = (multi_opaque_rect->color & 0xFFFF00FF) | (( + multi_opaque_rect->color = (multi_opaque_rect->color & 0x00FF00FF) | (( UINT32) byte << 8); } @@ -1154,8 +1150,8 @@ static BOOL update_read_multi_opaque_rect_order(wStream* s, return FALSE; Stream_Read_UINT8(s, byte); - multi_opaque_rect->color = (multi_opaque_rect->color & 0xFFFFFF00) | - (UINT32) byte; + multi_opaque_rect->color = (multi_opaque_rect->color & 0x0000FFFF) | + ((UINT32) byte << 16); } ORDER_FIELD_BYTE(8, multi_opaque_rect->numRectangles); @@ -1172,7 +1168,6 @@ static BOOL update_read_multi_opaque_rect_order(wStream* s, return TRUE; } - static BOOL update_read_multi_draw_nine_grid_order(wStream* s, ORDER_INFO* orderInfo, MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid) @@ -1191,7 +1186,6 @@ static BOOL update_read_multi_draw_nine_grid_order(wStream* s, return TRUE; } - static BOOL update_read_line_to_order(wStream* s, ORDER_INFO* orderInfo, LINE_TO_ORDER* line_to) { @@ -1200,20 +1194,18 @@ static BOOL update_read_line_to_order(wStream* s, ORDER_INFO* orderInfo, ORDER_FIELD_COORD(3, line_to->nYStart); ORDER_FIELD_COORD(4, line_to->nXEnd); ORDER_FIELD_COORD(5, line_to->nYEnd); - ORDER_FIELD_COLOR(6, line_to->backColor); + ORDER_FIELD_COLOR(orderInfo, s, 6, &line_to->backColor); ORDER_FIELD_BYTE(7, line_to->bRop2); ORDER_FIELD_BYTE(8, line_to->penStyle); ORDER_FIELD_BYTE(9, line_to->penWidth); - ORDER_FIELD_COLOR(10, line_to->penColor); + ORDER_FIELD_COLOR(orderInfo, s, 10, &line_to->penColor); return TRUE; } - int update_approximate_line_to_order(ORDER_INFO* orderInfo, const LINE_TO_ORDER* line_to) { return 32; } - BOOL update_write_line_to_order(wStream* s, ORDER_INFO* orderInfo, const LINE_TO_ORDER* line_to) { @@ -1244,7 +1236,6 @@ BOOL update_write_line_to_order(wStream* s, ORDER_INFO* orderInfo, update_write_color(s, line_to->penColor); return TRUE; } - static BOOL update_read_polyline_order(wStream* s, ORDER_INFO* orderInfo, POLYLINE_ORDER* polyline) { @@ -1254,7 +1245,7 @@ static BOOL update_read_polyline_order(wStream* s, ORDER_INFO* orderInfo, ORDER_FIELD_COORD(2, polyline->yStart); ORDER_FIELD_BYTE(3, polyline->bRop2); ORDER_FIELD_UINT16(4, word); - ORDER_FIELD_COLOR(5, polyline->penColor); + ORDER_FIELD_COLOR(orderInfo, s, 5, &polyline->penColor); ORDER_FIELD_BYTE(6, new_num); if (orderInfo->fieldFlags & ORDER_FIELD_07) @@ -1285,7 +1276,6 @@ static BOOL update_read_polyline_order(wStream* s, ORDER_INFO* orderInfo, return TRUE; } - static BOOL update_read_memblt_order(wStream* s, ORDER_INFO* orderInfo, MEMBLT_ORDER* memblt) { @@ -1303,13 +1293,11 @@ static BOOL update_read_memblt_order(wStream* s, ORDER_INFO* orderInfo, memblt->bitmap = NULL; return TRUE; } - int update_approximate_memblt_order(ORDER_INFO* orderInfo, const MEMBLT_ORDER* memblt) { return 64; } - BOOL update_write_memblt_order(wStream* s, ORDER_INFO* orderInfo, const MEMBLT_ORDER* memblt) { @@ -1340,7 +1328,6 @@ BOOL update_write_memblt_order(wStream* s, ORDER_INFO* orderInfo, Stream_Write_UINT16(s, memblt->cacheIndex); return TRUE; } - static BOOL update_read_mem3blt_order(wStream* s, ORDER_INFO* orderInfo, MEM3BLT_ORDER* mem3blt) { @@ -1352,8 +1339,8 @@ static BOOL update_read_mem3blt_order(wStream* s, ORDER_INFO* orderInfo, ORDER_FIELD_BYTE(6, mem3blt->bRop); ORDER_FIELD_COORD(7, mem3blt->nXSrc); ORDER_FIELD_COORD(8, mem3blt->nYSrc); - ORDER_FIELD_COLOR(9, mem3blt->backColor); - ORDER_FIELD_COLOR(10, mem3blt->foreColor); + ORDER_FIELD_COLOR(orderInfo, s, 9, &mem3blt->backColor); + ORDER_FIELD_COLOR(orderInfo, s, 10, &mem3blt->foreColor); if (!update_read_brush(s, &mem3blt->brush, orderInfo->fieldFlags >> 10)) return FALSE; @@ -1364,7 +1351,6 @@ static BOOL update_read_mem3blt_order(wStream* s, ORDER_INFO* orderInfo, mem3blt->bitmap = NULL; return TRUE; } - static BOOL update_read_save_bitmap_order(wStream* s, ORDER_INFO* orderInfo, SAVE_BITMAP_ORDER* save_bitmap) { @@ -1376,7 +1362,6 @@ static BOOL update_read_save_bitmap_order(wStream* s, ORDER_INFO* orderInfo, ORDER_FIELD_BYTE(6, save_bitmap->operation); return TRUE; } - static BOOL update_read_glyph_index_order(wStream* s, ORDER_INFO* orderInfo, GLYPH_INDEX_ORDER* glyph_index) { @@ -1384,8 +1369,8 @@ static BOOL update_read_glyph_index_order(wStream* s, ORDER_INFO* orderInfo, ORDER_FIELD_BYTE(2, glyph_index->flAccel); ORDER_FIELD_BYTE(3, glyph_index->ulCharInc); ORDER_FIELD_BYTE(4, glyph_index->fOpRedundant); - ORDER_FIELD_COLOR(5, glyph_index->backColor); - ORDER_FIELD_COLOR(6, glyph_index->foreColor); + ORDER_FIELD_COLOR(orderInfo, s, 5, &glyph_index->backColor); + ORDER_FIELD_COLOR(orderInfo, s, 6, &glyph_index->foreColor); ORDER_FIELD_UINT16(7, glyph_index->bkLeft); ORDER_FIELD_UINT16(8, glyph_index->bkTop); ORDER_FIELD_UINT16(9, glyph_index->bkRight); @@ -1417,13 +1402,11 @@ static BOOL update_read_glyph_index_order(wStream* s, ORDER_INFO* orderInfo, return TRUE; } - int update_approximate_glyph_index_order(ORDER_INFO* orderInfo, const GLYPH_INDEX_ORDER* glyph_index) { return 64; } - BOOL update_write_glyph_index_order(wStream* s, ORDER_INFO* orderInfo, GLYPH_INDEX_ORDER* glyph_index) { @@ -1476,14 +1459,13 @@ BOOL update_write_glyph_index_order(wStream* s, ORDER_INFO* orderInfo, Stream_Write(s, glyph_index->data, glyph_index->cbData); return TRUE; } - static BOOL update_read_fast_index_order(wStream* s, ORDER_INFO* orderInfo, FAST_INDEX_ORDER* fast_index) { ORDER_FIELD_BYTE(1, fast_index->cacheId); ORDER_FIELD_2BYTE(2, fast_index->ulCharInc, fast_index->flAccel); - ORDER_FIELD_COLOR(3, fast_index->backColor); - ORDER_FIELD_COLOR(4, fast_index->foreColor); + ORDER_FIELD_COLOR(orderInfo, s, 3, &fast_index->backColor); + ORDER_FIELD_COLOR(orderInfo, s, 4, &fast_index->foreColor); ORDER_FIELD_COORD(5, fast_index->bkLeft); ORDER_FIELD_COORD(6, fast_index->bkTop); ORDER_FIELD_COORD(7, fast_index->bkRight); @@ -1511,7 +1493,6 @@ static BOOL update_read_fast_index_order(wStream* s, ORDER_INFO* orderInfo, return TRUE; } - static BOOL update_read_fast_glyph_order(wStream* s, ORDER_INFO* orderInfo, FAST_GLYPH_ORDER* fastGlyph) { @@ -1519,8 +1500,8 @@ static BOOL update_read_fast_glyph_order(wStream* s, ORDER_INFO* orderInfo, GLYPH_DATA_V2* glyph = &fastGlyph->glyphData; ORDER_FIELD_BYTE(1, fastGlyph->cacheId); ORDER_FIELD_2BYTE(2, fastGlyph->ulCharInc, fastGlyph->flAccel); - ORDER_FIELD_COLOR(3, fastGlyph->backColor); - ORDER_FIELD_COLOR(4, fastGlyph->foreColor); + ORDER_FIELD_COLOR(orderInfo, s, 3, &fastGlyph->backColor); + ORDER_FIELD_COLOR(orderInfo, s, 4, &fastGlyph->foreColor); ORDER_FIELD_COORD(5, fastGlyph->bkLeft); ORDER_FIELD_COORD(6, fastGlyph->bkTop); ORDER_FIELD_COORD(7, fastGlyph->bkRight); @@ -1587,7 +1568,6 @@ static BOOL update_read_fast_glyph_order(wStream* s, ORDER_INFO* orderInfo, return TRUE; } - static BOOL update_read_polygon_sc_order(wStream* s, ORDER_INFO* orderInfo, POLYGON_SC_ORDER* polygon_sc) { @@ -1596,7 +1576,7 @@ static BOOL update_read_polygon_sc_order(wStream* s, ORDER_INFO* orderInfo, ORDER_FIELD_COORD(2, polygon_sc->yStart); ORDER_FIELD_BYTE(3, polygon_sc->bRop2); ORDER_FIELD_BYTE(4, polygon_sc->fillMode); - ORDER_FIELD_COLOR(5, polygon_sc->brushColor); + ORDER_FIELD_COLOR(orderInfo, s, 5, &polygon_sc->brushColor); ORDER_FIELD_BYTE(6, num); if (orderInfo->fieldFlags & ORDER_FIELD_07) @@ -1621,7 +1601,6 @@ static BOOL update_read_polygon_sc_order(wStream* s, ORDER_INFO* orderInfo, return TRUE; } - static BOOL update_read_polygon_cb_order(wStream* s, ORDER_INFO* orderInfo, POLYGON_CB_ORDER* polygon_cb) { @@ -1630,8 +1609,8 @@ static BOOL update_read_polygon_cb_order(wStream* s, ORDER_INFO* orderInfo, ORDER_FIELD_COORD(2, polygon_cb->yStart); ORDER_FIELD_BYTE(3, polygon_cb->bRop2); ORDER_FIELD_BYTE(4, polygon_cb->fillMode); - ORDER_FIELD_COLOR(5, polygon_cb->backColor); - ORDER_FIELD_COLOR(6, polygon_cb->foreColor); + ORDER_FIELD_COLOR(orderInfo, s, 5, &polygon_cb->backColor); + ORDER_FIELD_COLOR(orderInfo, s, 6, &polygon_cb->foreColor); if (!update_read_brush(s, &polygon_cb->brush, orderInfo->fieldFlags >> 6)) return FALSE; @@ -1665,7 +1644,6 @@ static BOOL update_read_polygon_cb_order(wStream* s, ORDER_INFO* orderInfo, polygon_cb->bRop2 = (polygon_cb->bRop2 & 0x1F); return TRUE; } - static BOOL update_read_ellipse_sc_order(wStream* s, ORDER_INFO* orderInfo, ELLIPSE_SC_ORDER* ellipse_sc) { @@ -1675,10 +1653,9 @@ static BOOL update_read_ellipse_sc_order(wStream* s, ORDER_INFO* orderInfo, ORDER_FIELD_COORD(4, ellipse_sc->bottomRect); ORDER_FIELD_BYTE(5, ellipse_sc->bRop2); ORDER_FIELD_BYTE(6, ellipse_sc->fillMode); - ORDER_FIELD_COLOR(7, ellipse_sc->color); + ORDER_FIELD_COLOR(orderInfo, s, 7, &ellipse_sc->color); return TRUE; } - static BOOL update_read_ellipse_cb_order(wStream* s, ORDER_INFO* orderInfo, ELLIPSE_CB_ORDER* ellipse_cb) { @@ -1688,11 +1665,10 @@ static BOOL update_read_ellipse_cb_order(wStream* s, ORDER_INFO* orderInfo, ORDER_FIELD_COORD(4, ellipse_cb->bottomRect); ORDER_FIELD_BYTE(5, ellipse_cb->bRop2); ORDER_FIELD_BYTE(6, ellipse_cb->fillMode); - ORDER_FIELD_COLOR(7, ellipse_cb->backColor); - ORDER_FIELD_COLOR(8, ellipse_cb->foreColor); + ORDER_FIELD_COLOR(orderInfo, s, 7, &ellipse_cb->backColor); + ORDER_FIELD_COLOR(orderInfo, s, 8, &ellipse_cb->foreColor); return update_read_brush(s, &ellipse_cb->brush, orderInfo->fieldFlags >> 8); } - /* Secondary Drawing Orders */ static BOOL update_read_cache_bitmap_order(wStream* s, CACHE_BITMAP_ORDER* cache_bitmap, @@ -1747,14 +1723,12 @@ static BOOL update_read_cache_bitmap_order(wStream* s, cache_bitmap->compressed = compressed; return TRUE; } - int update_approximate_cache_bitmap_order(const CACHE_BITMAP_ORDER* cache_bitmap, BOOL compressed, UINT16* flags) { return 64 + cache_bitmap->bitmapLength; } - BOOL update_write_cache_bitmap_order(wStream* s, const CACHE_BITMAP_ORDER* cache_bitmap, BOOL compressed, UINT16* flags) @@ -1797,7 +1771,6 @@ BOOL update_write_cache_bitmap_order(wStream* s, return TRUE; } - static BOOL update_read_cache_bitmap_v2_order(wStream* s, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2, BOOL compressed, UINT16 flags) @@ -1877,13 +1850,11 @@ static BOOL update_read_cache_bitmap_v2_order(wStream* s, cache_bitmap_v2->compressed = compressed; return TRUE; } - int update_approximate_cache_bitmap_v2_order(CACHE_BITMAP_V2_ORDER* cache_bitmap_v2, BOOL compressed, UINT16* flags) { return 64 + cache_bitmap_v2->bitmapLength; } - BOOL update_write_cache_bitmap_v2_order(wStream* s, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2, BOOL compressed, UINT16* flags) { @@ -1959,7 +1930,6 @@ BOOL update_write_cache_bitmap_v2_order(wStream* s, cache_bitmap_v2->compressed = compressed; return TRUE; } - static BOOL update_read_cache_bitmap_v3_order(wStream* s, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3, UINT16 flags) @@ -2008,14 +1978,12 @@ static BOOL update_read_cache_bitmap_v3_order(wStream* s, Stream_Read(s, bitmapData->data, bitmapData->length); return TRUE; } - int update_approximate_cache_bitmap_v3_order(CACHE_BITMAP_V3_ORDER* cache_bitmap_v3, UINT16* flags) { BITMAP_DATA_EX* bitmapData = &cache_bitmap_v3->bitmapData; return 64 + bitmapData->length; } - BOOL update_write_cache_bitmap_v3_order(wStream* s, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3, UINT16* flags) { @@ -2044,7 +2012,6 @@ BOOL update_write_cache_bitmap_v3_order(wStream* s, Stream_Write(s, bitmapData->data, bitmapData->length); return TRUE; } - static BOOL update_read_cache_color_table_order(wStream* s, CACHE_COLOR_TABLE_ORDER* cache_color_table, UINT16 flags) @@ -2071,19 +2038,15 @@ static BOOL update_read_cache_color_table_order(wStream* s, colorTable = (UINT32*) &cache_color_table->colorTable; for (i = 0; i < (int) cache_color_table->numberColors; i++) - { update_read_color_quad(s, &colorTable[i]); - } return TRUE; } - int update_approximate_cache_color_table_order( const CACHE_COLOR_TABLE_ORDER* cache_color_table, UINT16* flags) { return 16 + (256 * 4); } - BOOL update_write_cache_color_table_order(wStream* s, const CACHE_COLOR_TABLE_ORDER* cache_color_table, UINT16* flags) @@ -2111,12 +2074,11 @@ BOOL update_write_cache_color_table_order(wStream* s, return TRUE; } - static BOOL update_read_cache_glyph_order(wStream* s, CACHE_GLYPH_ORDER* cache_glyph_order, UINT16 flags) { - int i; + UINT32 i; INT16 lsi16; GLYPH_DATA* glyph; @@ -2126,7 +2088,7 @@ static BOOL update_read_cache_glyph_order(wStream* s, Stream_Read_UINT8(s, cache_glyph_order->cacheId); /* cacheId (1 byte) */ Stream_Read_UINT8(s, cache_glyph_order->cGlyphs); /* cGlyphs (1 byte) */ - for (i = 0; i < (int) cache_glyph_order->cGlyphs; i++) + for (i = 0; i < cache_glyph_order->cGlyphs; i++) { glyph = &cache_glyph_order->glyphData[i]; @@ -2161,13 +2123,11 @@ static BOOL update_read_cache_glyph_order(wStream* s, return TRUE; } - int update_approximate_cache_glyph_order( const CACHE_GLYPH_ORDER* cache_glyph, UINT16* flags) { return 2 + cache_glyph->cGlyphs * 32; } - BOOL update_write_cache_glyph_order(wStream* s, const CACHE_GLYPH_ORDER* cache_glyph, UINT16* flags) @@ -2206,7 +2166,6 @@ BOOL update_write_cache_glyph_order(wStream* s, return TRUE; } - static BOOL update_read_cache_glyph_v2_order(wStream* s, CACHE_GLYPH_V2_ORDER* cache_glyph_v2, UINT16 flags) @@ -2255,13 +2214,11 @@ static BOOL update_read_cache_glyph_v2_order(wStream* s, return TRUE; } - int update_approximate_cache_glyph_v2_order( const CACHE_GLYPH_V2_ORDER* cache_glyph_v2, UINT16* flags) { return 8 + cache_glyph_v2->cGlyphs * 32; } - BOOL update_write_cache_glyph_v2_order(wStream* s, const CACHE_GLYPH_V2_ORDER* cache_glyph_v2, UINT16* flags) @@ -2302,7 +2259,6 @@ BOOL update_write_cache_glyph_v2_order(wStream* s, return TRUE; } - static BOOL update_decompress_brush(wStream* s, BYTE* output, BYTE bpp) { int index; @@ -2335,12 +2291,10 @@ static BOOL update_decompress_brush(wStream* s, BYTE* output, BYTE bpp) return TRUE; } - static BOOL update_compress_brush(wStream* s, const BYTE* input, BYTE bpp) { return FALSE; } - static BOOL update_read_cache_brush_order(wStream* s, CACHE_BRUSH_ORDER* cache_brush, UINT16 flags) @@ -2415,13 +2369,11 @@ static BOOL update_read_cache_brush_order(wStream* s, return TRUE; } - int update_approximate_cache_brush_order( const CACHE_BRUSH_ORDER* cache_brush, UINT16* flags) { return 64; } - BOOL update_write_cache_brush_order(wStream* s, const CACHE_BRUSH_ORDER* cache_brush, UINT16* flags) @@ -2490,7 +2442,6 @@ BOOL update_write_cache_brush_order(wStream* s, return TRUE; } - /* Alternate Secondary Drawing Orders */ static BOOL update_read_create_offscreen_bitmap_order(wStream* s, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap) @@ -2545,7 +2496,6 @@ static BOOL update_read_create_offscreen_bitmap_order(wStream* s, return TRUE; } - int update_approximate_create_offscreen_bitmap_order( const CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap) { @@ -2553,7 +2503,6 @@ int update_approximate_create_offscreen_bitmap_order( (create_offscreen_bitmap->deleteList); return 32 + deleteList->cIndices * 2; } - BOOL update_write_create_offscreen_bitmap_order( wStream* s, const CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap) @@ -2590,7 +2539,6 @@ BOOL update_write_create_offscreen_bitmap_order( return TRUE; } - static BOOL update_read_switch_surface_order(wStream* s, SWITCH_SURFACE_ORDER* switch_surface) { @@ -2600,13 +2548,11 @@ static BOOL update_read_switch_surface_order(wStream* s, Stream_Read_UINT16(s, switch_surface->bitmapId); /* bitmapId (2 bytes) */ return TRUE; } - int update_approximate_switch_surface_order( const SWITCH_SURFACE_ORDER* switch_surface) { return 2; } - BOOL update_write_switch_surface_order( wStream* s, const SWITCH_SURFACE_ORDER* switch_surface) { @@ -2618,7 +2564,6 @@ BOOL update_write_switch_surface_order( Stream_Write_UINT16(s, switch_surface->bitmapId); /* bitmapId (2 bytes) */ return TRUE; } - static BOOL update_read_create_nine_grid_bitmap_order( wStream* s, CREATE_NINE_GRID_BITMAP_ORDER* create_nine_grid_bitmap) @@ -2651,7 +2596,6 @@ static BOOL update_read_create_nine_grid_bitmap_order( &nineGridInfo->crTransparent); /* crTransparent (4 bytes) */ return TRUE; } - static BOOL update_read_frame_marker_order(wStream* s, FRAME_MARKER_ORDER* frame_marker) { @@ -2661,7 +2605,6 @@ static BOOL update_read_frame_marker_order(wStream* s, Stream_Read_UINT32(s, frame_marker->action); /* action (4 bytes) */ return TRUE; } - static BOOL update_read_stream_bitmap_first_order( wStream* s, STREAM_BITMAP_FIRST_ORDER* stream_bitmap_first) { @@ -2707,7 +2650,6 @@ static BOOL update_read_stream_bitmap_first_order( stream_bitmap_first->bitmapBlockSize); /* bitmapBlockSize(2 bytes) + bitmapBlock */ return TRUE; } - static BOOL update_read_stream_bitmap_next_order( wStream* s, STREAM_BITMAP_NEXT_ORDER* stream_bitmap_next) { @@ -2722,7 +2664,6 @@ static BOOL update_read_stream_bitmap_next_order( stream_bitmap_next->bitmapBlockSize); /* bitmapBlockSize(2 bytes) + bitmapBlock */ return TRUE; } - static BOOL update_read_draw_gdiplus_first_order( wStream* s, DRAW_GDIPLUS_FIRST_ORDER* draw_gdiplus_first) { @@ -2737,7 +2678,6 @@ static BOOL update_read_draw_gdiplus_first_order( draw_gdiplus_first->cbTotalEmfSize); /* cbTotalEmfSize (4 bytes) */ return Stream_SafeSeek(s, draw_gdiplus_first->cbSize); /* emfRecords */ } - static BOOL update_read_draw_gdiplus_next_order( wStream* s, DRAW_GDIPLUS_NEXT_ORDER* draw_gdiplus_next) { @@ -2749,7 +2689,6 @@ static BOOL update_read_draw_gdiplus_next_order( draw_gdiplus_next->cbSize); /* cbSize(2 bytes) + emfRecords */ return TRUE; } - static BOOL update_read_draw_gdiplus_end_order( wStream* s, DRAW_GDIPLUS_END_ORDER* draw_gdiplus_end) { @@ -2764,7 +2703,6 @@ static BOOL update_read_draw_gdiplus_end_order( draw_gdiplus_end->cbTotalEmfSize); /* cbTotalEmfSize (4 bytes) */ return Stream_SafeSeek(s, draw_gdiplus_end->cbSize); /* emfRecords */ } - static BOOL update_read_draw_gdiplus_cache_first_order( wStream* s, DRAW_GDIPLUS_CACHE_FIRST_ORDER* draw_gdiplus_cache_first) { @@ -2781,7 +2719,6 @@ static BOOL update_read_draw_gdiplus_cache_first_order( draw_gdiplus_cache_first->cbTotalSize); /* cbTotalSize (4 bytes) */ return Stream_SafeSeek(s, draw_gdiplus_cache_first->cbSize); /* emfRecords */ } - static BOOL update_read_draw_gdiplus_cache_next_order( wStream* s, DRAW_GDIPLUS_CACHE_NEXT_ORDER* draw_gdiplus_cache_next) { @@ -2797,7 +2734,6 @@ static BOOL update_read_draw_gdiplus_cache_next_order( draw_gdiplus_cache_next->cbSize); /* cbSize(2 bytes) + emfRecords */ return TRUE; } - static BOOL update_read_draw_gdiplus_cache_end_order( wStream* s, DRAW_GDIPLUS_CACHE_END_ORDER* draw_gdiplus_cache_end) { @@ -2814,8 +2750,8 @@ static BOOL update_read_draw_gdiplus_cache_end_order( draw_gdiplus_cache_end->cbTotalSize); /* cbTotalSize (4 bytes) */ return Stream_SafeSeek(s, draw_gdiplus_cache_end->cbSize); /* emfRecords */ } - -static BOOL update_read_field_flags(wStream* s, UINT32* fieldFlags, BYTE flags, +static BOOL update_read_field_flags(wStream* s, UINT32* fieldFlags, + BYTE flags, BYTE fieldBytes) { int i; @@ -2845,7 +2781,6 @@ static BOOL update_read_field_flags(wStream* s, UINT32* fieldFlags, BYTE flags, return TRUE; } - BOOL update_write_field_flags(wStream* s, UINT32 fieldFlags, BYTE flags, BYTE fieldBytes) { @@ -2879,7 +2814,6 @@ BOOL update_write_field_flags(wStream* s, UINT32 fieldFlags, BYTE flags, return TRUE; } - static BOOL update_read_bounds(wStream* s, rdpBounds* bounds) { BYTE flags; @@ -2935,7 +2869,6 @@ static BOOL update_read_bounds(wStream* s, rdpBounds* bounds) return TRUE; } - BOOL update_write_bounds(wStream* s, ORDER_INFO* orderInfo) { if (!(orderInfo->controlFlags & ORDER_BOUNDS)) @@ -2984,7 +2917,6 @@ BOOL update_write_bounds(wStream* s, ORDER_INFO* orderInfo) return TRUE; } - BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) { ORDER_INFO* orderInfo; @@ -3294,7 +3226,6 @@ BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return TRUE; } - BOOL update_recv_secondary_order(rdpUpdate* update, wStream* s, BYTE flags) { BYTE* next; @@ -3455,8 +3386,8 @@ BOOL update_recv_secondary_order(rdpUpdate* update, wStream* s, BYTE flags) Stream_SetPointer(s, next); return TRUE; } - -static BOOL update_recv_altsec_order(rdpUpdate* update, wStream* s, BYTE flags) +static BOOL update_recv_altsec_order(rdpUpdate* update, wStream* s, + BYTE flags) { BYTE orderType; rdpContext* context = update->context; @@ -3641,7 +3572,6 @@ static BOOL update_recv_altsec_order(rdpUpdate* update, wStream* s, BYTE flags) return TRUE; } - BOOL update_recv_order(rdpUpdate* update, wStream* s) { BYTE controlFlags; diff --git a/libfreerdp/gdi/gdi.c b/libfreerdp/gdi/gdi.c index c66ca9f69..80d2db219 100644 --- a/libfreerdp/gdi/gdi.c +++ b/libfreerdp/gdi/gdi.c @@ -318,6 +318,20 @@ static const BYTE GDI_BS_HATCHED_PATTERNS[] = 0x7E, 0xBD, 0xDB, 0xE7, 0xE7, 0xDB, 0xBD, 0x7E /* HS_DIACROSS */ }; +static INLINE BOOL decode_color(rdpGdi* gdi, const UINT32 srcColor, + UINT32* color, UINT32* format) +{ + UINT32 SrcFormat = gdi_get_pixel_format(gdi->context->settings->ColorDepth, + FALSE); + + if (format) + *format = SrcFormat; + + *color = ConvertColor(srcColor, SrcFormat, + gdi->drawing->hdc->format, &gdi->palette); + return TRUE; +} + /* GDI Helper Functions */ INLINE DWORD gdi_rop3_code(BYTE code) { @@ -459,7 +473,6 @@ void gdi_bitmap_free_ex(gdiBitmap* bitmap) static BOOL gdi_bitmap_update(rdpContext* context, const BITMAP_UPDATE* bitmapUpdate) { - int status; UINT32 index; rdpGdi* gdi = context->gdi; rdpCodecs* codecs = context->codecs; @@ -482,28 +495,24 @@ static BOOL gdi_bitmap_update(rdpContext* context, { if (bitsPerPixel < 32) { - status = interleaved_decompress(codecs->interleaved, - pSrcData, SrcSize, - bitsPerPixel, - gdi->primary_buffer, - gdi->dstFormat, - gdi->stride, nXDst, nYDst, - nWidth, nHeight, - &gdi->palette); + if (!interleaved_decompress(codecs->interleaved, + pSrcData, SrcSize, + bitsPerPixel, + gdi->primary_buffer, + gdi->primary->hdc->format, + gdi->stride, nXDst, nYDst, + nWidth, nHeight, + &gdi->palette)) + return FALSE; } else { - status = planar_decompress(codecs->planar, pSrcData, - SrcSize, gdi->primary_buffer, - gdi->dstFormat, - gdi->stride, - nXDst, nYDst, nWidth, nHeight, TRUE); - } - - if (status < 0) - { - WLog_ERR(TAG, "bitmap decompression failure"); - return FALSE; + if (!planar_decompress(codecs->planar, pSrcData, + SrcSize, gdi->primary_buffer, + gdi->primary->hdc->format, + gdi->stride, + nXDst, nYDst, nWidth, nHeight, TRUE)) + return FALSE; } } else @@ -515,7 +524,8 @@ static BOOL gdi_bitmap_update(rdpContext* context, nHeight = MIN(bitmap->destBottom, gdi->height - 1) - bitmap->destTop + 1; /* clip height */ - if (!freerdp_image_copy(gdi->primary_buffer, gdi->dstFormat, gdi->stride, + if (!freerdp_image_copy(gdi->primary_buffer, gdi->primary->hdc->format, + gdi->stride, nXDst, nYDst, nWidth, nHeight, pSrcData, SrcFormat, nSrcStep, nXSrc, nYSrc, &gdi->palette)) @@ -579,14 +589,16 @@ static BOOL gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) HGDI_BRUSH originalBrush; rdpGdi* gdi = context->gdi; BOOL ret = TRUE; - UINT32 SrcFormat = gdi_get_pixel_format(patblt->brush.bpp, FALSE); - DWORD rop = gdi_rop3_code(patblt->bRop); + const DWORD rop = gdi_rop3_code(patblt->bRop); UINT32 nXSrc = 0; UINT32 nYSrc = 0; - foreColor = ConvertColor(patblt->foreColor, SrcFormat, - gdi->drawing->hdc->format, &gdi->palette); - backColor = ConvertColor(patblt->backColor, SrcFormat, - gdi->drawing->hdc->format, &gdi->palette); + + if (!decode_color(gdi, patblt->foreColor, &foreColor, NULL)) + return FALSE; + + if (!decode_color(gdi, patblt->backColor, &backColor, NULL)) + return FALSE; + originalColor = gdi_SetTextColor(gdi->drawing->hdc, foreColor); switch (brush->style) @@ -763,11 +775,11 @@ static BOOL gdi_opaque_rect(rdpContext* context, UINT32 brush_color; rdpGdi* gdi = context->gdi; BOOL ret; - UINT32 SrcFormat = gdi_get_pixel_format(context->settings->ColorDepth, FALSE); gdi_CRgnToRect(opaque_rect->nLeftRect, opaque_rect->nTopRect, opaque_rect->nWidth, opaque_rect->nHeight, &rect); - brush_color = ConvertColor(opaque_rect->color, PIXEL_FORMAT_RGB16, - gdi->drawing->hdc->format, &gdi->palette); + + if (!decode_color(gdi, opaque_rect->color, &brush_color, NULL)) + return FALSE; if (!(hBrush = gdi_CreateSolidBrush(brush_color))) return FALSE; @@ -784,30 +796,26 @@ static BOOL gdi_multi_opaque_rect(rdpContext* context, GDI_RECT rect; HGDI_BRUSH hBrush; UINT32 brush_color; - const DELTA_RECT* rectangle; rdpGdi* gdi = context->gdi; - UINT32 SrcFormat = gdi_get_pixel_format(context->settings->ColorDepth, FALSE); BOOL ret = TRUE; + if (!decode_color(gdi, multi_opaque_rect->color, &brush_color, NULL)) + return FALSE; + + hBrush = gdi_CreateSolidBrush(brush_color); + + if (!hBrush) + return FALSE; + for (i = 1; i < multi_opaque_rect->numRectangles + 1; i++) { - rectangle = &multi_opaque_rect->rectangles[i]; + const DELTA_RECT* rectangle = &multi_opaque_rect->rectangles[i]; gdi_CRgnToRect(rectangle->left, rectangle->top, rectangle->width, rectangle->height, &rect); - brush_color = ConvertColor(multi_opaque_rect->color, SrcFormat, - gdi->drawing->hdc->format, &gdi->palette); - hBrush = gdi_CreateSolidBrush(brush_color); - - if (!hBrush) - { - ret = FALSE; - break; - } - gdi_FillRect(gdi->drawing->hdc, &rect, hBrush); - gdi_DeleteObject((HGDIOBJECT) hBrush); } + gdi_DeleteObject((HGDIOBJECT) hBrush); return ret; } @@ -815,9 +823,11 @@ static BOOL gdi_line_to(rdpContext* context, const LINE_TO_ORDER* lineTo) { UINT32 color; HGDI_PEN hPen; + UINT32 SrcFormat; rdpGdi* gdi = context->gdi; - color = lineTo->penColor; - UINT32 SrcFormat = gdi_get_pixel_format(context->settings->ColorDepth, FALSE); + + if (!decode_color(gdi, lineTo->backColor, &color, &SrcFormat)) + return FALSE; if (!(hPen = gdi_CreatePen(lineTo->penStyle, lineTo->penWidth, color, SrcFormat, &gdi->palette))) @@ -839,9 +849,11 @@ static BOOL gdi_polyline(rdpContext* context, const POLYLINE_ORDER* polyline) UINT32 color; HGDI_PEN hPen; DELTA_POINT* points; + UINT32 SrcFormat; rdpGdi* gdi = context->gdi; - UINT32 SrcFormat = gdi_get_pixel_format(context->settings->ColorDepth, FALSE); - color = polyline->penColor; + + if (!decode_color(gdi, polyline->penColor, &color, &SrcFormat)) + return FALSE; if (!(hPen = gdi_CreatePen(GDI_PS_SOLID, 1, color, SrcFormat, &gdi->palette))) return FALSE; @@ -880,15 +892,19 @@ static BOOL gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) HGDI_BRUSH originalBrush; rdpGdi* gdi = context->gdi; BOOL ret = TRUE; - const UINT32 SrcFormat = gdi_get_pixel_format(context->settings->ColorDepth, - FALSE); const rdpBrush* brush = &mem3blt->brush; gdiBitmap* bitmap = (gdiBitmap*) mem3blt->bitmap; - const UINT32 foreColor = ConvertColor(mem3blt->foreColor, SrcFormat, - gdi->drawing->hdc->format, &gdi->palette); - const UINT32 backColor = ConvertColor(mem3blt->backColor, SrcFormat, - gdi->drawing->hdc->format, &gdi->palette); - const UINT32 originalColor = gdi_SetTextColor(gdi->drawing->hdc, foreColor); + UINT32 foreColor; + UINT32 backColor; + UINT32 originalColor; + + if (!decode_color(gdi, mem3blt->foreColor, &foreColor, NULL)) + return FALSE; + + if (!decode_color(gdi, mem3blt->backColor, &backColor, NULL)) + return FALSE; + + originalColor = gdi_SetTextColor(gdi->drawing->hdc, foreColor); switch (brush->style) { @@ -914,7 +930,8 @@ static BOOL gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) { HGDI_BITMAP hBmp; UINT32 brushFormat; - BYTE* data = (BYTE*) _aligned_malloc(8 * 8 * GetBytesPerPixel(gdi->dstFormat), + BYTE* data = (BYTE*) _aligned_malloc(8 * 8 * GetBytesPerPixel( + gdi->drawing->hdc->format), 16); if (!data) @@ -927,7 +944,7 @@ static BOOL gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) { brushFormat = gdi_get_pixel_format(brush->bpp, FALSE); - if (!freerdp_image_copy(data, gdi->dstFormat, 0, 0, 0, + if (!freerdp_image_copy(data, gdi->drawing->hdc->format, 0, 0, 0, 8, 8, brush->data, brushFormat, 0, 0, 0, &gdi->palette)) { @@ -938,7 +955,8 @@ static BOOL gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) } else { - if (!freerdp_image_copy_from_monochrome(data, gdi->dstFormat, 0, 0, 0, 8, 8, + if (!freerdp_image_copy_from_monochrome(data, gdi->drawing->hdc->format, 0, 0, + 0, 8, 8, brush->data, backColor, foreColor, &gdi->palette)) { diff --git a/libfreerdp/gdi/gfx.c b/libfreerdp/gdi/gfx.c index 479a67fe6..35b4fbe93 100644 --- a/libfreerdp/gdi/gfx.c +++ b/libfreerdp/gdi/gfx.c @@ -116,10 +116,14 @@ static UINT gdi_OutputUpdate(rdpGdi* gdi, gdiGfxSurface* surface) width = extents->right - extents->left; height = extents->bottom - extents->top; update->BeginPaint(gdi->context); - freerdp_image_copy(gdi->primary_buffer, gdi->dstFormat, gdi->stride, - nXDst, nYDst, width, height, - surface->data, surface->format, - surface->scanline, nXSrc, nYSrc, NULL); + + if (!freerdp_image_copy(gdi->primary_buffer, gdi->primary->hdc->format, + gdi->stride, + nXDst, nYDst, width, height, + surface->data, surface->format, + surface->scanline, nXSrc, nYSrc, NULL)) + return CHANNEL_RC_NULL_DATA; + gdi_InvalidateRegion(gdi->primary->hdc, nXDst, nYDst, width, height); update->EndPaint(gdi->context); } @@ -314,7 +318,6 @@ static UINT gdi_SurfaceCommand_ClearCodec(rdpGdi* gdi, static UINT gdi_SurfaceCommand_Planar(rdpGdi* gdi, RdpgfxClientContext* context, const RDPGFX_SURFACE_COMMAND* cmd) { - INT32 rc; UINT status = CHANNEL_RC_OK; BYTE* DstData = NULL; gdiGfxSurface* surface; @@ -325,12 +328,11 @@ static UINT gdi_SurfaceCommand_Planar(rdpGdi* gdi, RdpgfxClientContext* context, return ERROR_INTERNAL_ERROR; DstData = surface->data; - rc = planar_decompress(surface->codecs->planar, cmd->data, cmd->length, + + if (!planar_decompress(surface->codecs->planar, cmd->data, cmd->length, DstData, surface->format, surface->scanline, cmd->left, cmd->top, - cmd->width, cmd->height, FALSE); - - if (rc < 0) + cmd->width, cmd->height, FALSE)) return ERROR_INTERNAL_ERROR; invalidRect.left = cmd->left; diff --git a/libfreerdp/gdi/graphics.c b/libfreerdp/gdi/graphics.c index fed94184d..e19273d6e 100644 --- a/libfreerdp/gdi/graphics.c +++ b/libfreerdp/gdi/graphics.c @@ -128,7 +128,6 @@ static BOOL gdi_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, UINT32 bpp, UINT32 length, BOOL compressed, UINT32 codecId) { - int status; UINT16 size; UINT32 SrcSize = length; UINT32 SrcFormat; @@ -149,32 +148,30 @@ static BOOL gdi_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, { if (bpp < 32) { - status = interleaved_decompress(context->codecs->interleaved, - pSrcData, SrcSize, - bpp, - bitmap->data, bitmap->format, - 0, 0, 0, width, height, - &gdi->palette); + if (!interleaved_decompress(context->codecs->interleaved, + pSrcData, SrcSize, + bpp, + bitmap->data, bitmap->format, + 0, 0, 0, width, height, + &gdi->palette)) + return FALSE; } else { - status = planar_decompress(context->codecs->planar, pSrcData, SrcSize, - bitmap->data, bitmap->format, 0, 0, 0, - width, height, TRUE); - } - - if (status < 0) - { - WLog_ERR(TAG, "Bitmap Decompression Failed"); - return FALSE; + if (!planar_decompress(context->codecs->planar, pSrcData, SrcSize, + bitmap->data, bitmap->format, 0, 0, 0, + width, height, TRUE)) + return FALSE; } } else { SrcFormat = gdi_get_pixel_format(bpp, TRUE); - status = freerdp_image_copy(bitmap->data, bitmap->format, 0, 0, 0, - width, height, pSrcData, SrcFormat, - 0, 0, 0, &gdi->palette); + + if (!freerdp_image_copy(bitmap->data, bitmap->format, 0, 0, 0, + width, height, pSrcData, SrcFormat, + 0, 0, 0, &gdi->palette)) + return FALSE; } return TRUE;