#define TAG FREERDP_TAG("codec")
+static INLINE UINT32 planar_invert_format(BITMAP_PLANAR_CONTEXT* planar, BOOL alpha,
+ UINT32 DstFormat)
+{
+
+ if (planar->bgr && alpha)
+ {
+ switch (DstFormat)
+ {
+ case PIXEL_FORMAT_ARGB32:
+ DstFormat = PIXEL_FORMAT_ABGR32;
+ break;
+ case PIXEL_FORMAT_XRGB32:
+ DstFormat = PIXEL_FORMAT_XBGR32;
+ break;
+ case PIXEL_FORMAT_ABGR32:
+ DstFormat = PIXEL_FORMAT_ARGB32;
+ break;
+ case PIXEL_FORMAT_XBGR32:
+ DstFormat = PIXEL_FORMAT_XRGB32;
+ break;
+ case PIXEL_FORMAT_BGRA32:
+ DstFormat = PIXEL_FORMAT_RGBA32;
+ break;
+ case PIXEL_FORMAT_BGRX32:
+ DstFormat = PIXEL_FORMAT_RGBX32;
+ break;
+ case PIXEL_FORMAT_RGBA32:
+ DstFormat = PIXEL_FORMAT_BGRA32;
+ break;
+ case PIXEL_FORMAT_RGBX32:
+ DstFormat = PIXEL_FORMAT_BGRX32;
+ break;
+ case PIXEL_FORMAT_RGB24:
+ DstFormat = PIXEL_FORMAT_BGR24;
+ break;
+ case PIXEL_FORMAT_BGR24:
+ DstFormat = PIXEL_FORMAT_RGB24;
+ break;
+ case PIXEL_FORMAT_RGB16:
+ DstFormat = PIXEL_FORMAT_BGR16;
+ break;
+ case PIXEL_FORMAT_BGR16:
+ DstFormat = PIXEL_FORMAT_RGB16;
+ break;
+ case PIXEL_FORMAT_ARGB15:
+ DstFormat = PIXEL_FORMAT_ABGR15;
+ break;
+ case PIXEL_FORMAT_RGB15:
+ DstFormat = PIXEL_FORMAT_BGR15;
+ break;
+ case PIXEL_FORMAT_ABGR15:
+ DstFormat = PIXEL_FORMAT_ARGB15;
+ break;
+ case PIXEL_FORMAT_BGR15:
+ DstFormat = PIXEL_FORMAT_RGB15;
+ break;
+ default:
+ break;
+ }
+ }
+ return DstFormat;
+}
+
static INLINE BOOL freerdp_bitmap_planar_compress_plane_rle(const BYTE* plane, UINT32 width,
UINT32 height, BYTE* outPlane,
UINT32* dstSize);
switch (DstFormat)
{
- case PIXEL_FORMAT_BGRA32:
- for (x = 0; x < width; x++)
- {
- *(*ppRgba)++ = *(*ppB)++;
- *(*ppRgba)++ = *(*ppG)++;
- *(*ppRgba)++ = *(*ppR)++;
- *(*ppRgba)++ = *(*ppA)++;
- }
-
- return TRUE;
-
- case PIXEL_FORMAT_BGRX32:
- for (x = 0; x < width; x++)
- {
- *(*ppRgba)++ = *(*ppB)++;
- *(*ppRgba)++ = *(*ppG)++;
- *(*ppRgba)++ = *(*ppR)++;
- *(*ppRgba)++ = 0xFF;
- }
+ case PIXEL_FORMAT_BGRA32:
+ for (x = 0; x < width; x++)
+ {
+ *(*ppRgba)++ = *(*ppB)++;
+ *(*ppRgba)++ = *(*ppG)++;
+ *(*ppRgba)++ = *(*ppR)++;
+ *(*ppRgba)++ = *(*ppA)++;
+ }
- return TRUE;
+ return TRUE;
- default:
- if (ppA)
- {
+ case PIXEL_FORMAT_BGRX32:
for (x = 0; x < width; x++)
{
- BYTE alpha = *(*ppA)++;
- UINT32 color = FreeRDPGetColor(DstFormat, *(*ppR)++, *(*ppG)++, *(*ppB)++, alpha);
- WriteColor(*ppRgba, DstFormat, color);
- *ppRgba += GetBytesPerPixel(DstFormat);
+ *(*ppRgba)++ = *(*ppB)++;
+ *(*ppRgba)++ = *(*ppG)++;
+ *(*ppRgba)++ = *(*ppR)++;
+ *(*ppRgba)++ = 0xFF;
}
- }
- else
- {
- const BYTE alpha = 0xFF;
- for (x = 0; x < width; x++)
+ return TRUE;
+
+ default:
+ if (ppA)
{
- UINT32 color = FreeRDPGetColor(DstFormat, *(*ppR)++, *(*ppG)++, *(*ppB)++, alpha);
- WriteColor(*ppRgba, DstFormat, color);
- *ppRgba += GetBytesPerPixel(DstFormat);
+ for (x = 0; x < width; x++)
+ {
+ BYTE alpha = *(*ppA)++;
+ UINT32 color =
+ FreeRDPGetColor(DstFormat, *(*ppR)++, *(*ppG)++, *(*ppB)++, alpha);
+ WriteColor(*ppRgba, DstFormat, color);
+ *ppRgba += GetBytesPerPixel(DstFormat);
+ }
}
- }
+ else
+ {
+ const BYTE alpha = 0xFF;
- return TRUE;
+ for (x = 0; x < width; x++)
+ {
+ UINT32 color =
+ FreeRDPGetColor(DstFormat, *(*ppR)++, *(*ppG)++, *(*ppB)++, alpha);
+ WriteColor(*ppRgba, DstFormat, color);
+ *ppRgba += GetBytesPerPixel(DstFormat);
+ }
+ }
+
+ return TRUE;
}
}
rle = (FormatHeader & PLANAR_FORMAT_HEADER_RLE) ? TRUE : FALSE;
alpha = (FormatHeader & PLANAR_FORMAT_HEADER_NA) ? FALSE : TRUE;
+ DstFormat = planar_invert_format(planar, alpha, DstFormat);
+
if (alpha)
useAlpha = ColorHasAlpha(DstFormat);
planeSize = width * height;
+ if (!context->AllowSkipAlpha)
+ format = planar_invert_format(context, TRUE, format);
+
if (!freerdp_split_color_planes(data, format, width, height, scanline, context->planes))
return NULL;
if (!context)
return FALSE;
+ context->bgr = FALSE;
context->maxWidth = width;
context->maxHeight = height;
context->maxPlaneSize = context->maxWidth * context->maxHeight;
free(context->rlePlanesBuffer);
free(context);
}
+
+void freerdp_planar_switch_bgr(BITMAP_PLANAR_CONTEXT* planar, BOOL bgr)
+{
+ planar->bgr = bgr;
+}