Blame include/freerdp/codec/color.h

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 * Color Conversion Routines
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2010 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 * Copyright 2016 Armin Novak <armin.novak@thincast.com>
Packit 1fb8d4
 * Copyright 2016 Thincast Technologies GmbH
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifndef FREERDP_CODEC_COLOR_H
Packit 1fb8d4
#define FREERDP_CODEC_COLOR_H
Packit 1fb8d4
Packit 1fb8d4
#include <freerdp/api.h>
Packit 1fb8d4
#include <winpr/wlog.h>
Packit 1fb8d4
#include <freerdp/log.h>
Packit 1fb8d4
#define CTAG FREERDP_TAG("codec.color")
Packit 1fb8d4
Packit 1fb8d4
#define FREERDP_PIXEL_FORMAT_TYPE_A		0
Packit 1fb8d4
#define FREERDP_PIXEL_FORMAT_TYPE_ARGB		1
Packit 1fb8d4
#define FREERDP_PIXEL_FORMAT_TYPE_ABGR		2
Packit 1fb8d4
#define FREERDP_PIXEL_FORMAT_TYPE_RGBA		3
Packit 1fb8d4
#define FREERDP_PIXEL_FORMAT_TYPE_BGRA		4
Packit 1fb8d4
Packit 1fb8d4
#define FREERDP_PIXEL_FORMAT_IS_ABGR(_format)	(FREERDP_PIXEL_FORMAT_TYPE(_format) == FREERDP_PIXEL_FORMAT_TYPE_ABGR)
Packit 1fb8d4
Packit 1fb8d4
#define FREERDP_FLIP_NONE			0
Packit 1fb8d4
#define FREERDP_FLIP_VERTICAL		1
Packit 1fb8d4
#define FREERDP_FLIP_HORIZONTAL		2
Packit 1fb8d4
Packit 1fb8d4
#define FREERDP_PIXEL_FORMAT(_bpp, _type, _a, _r, _g, _b) \
Packit 1fb8d4
	((_bpp << 24) | (_type << 16) | (_a << 12) | (_r << 8) | (_g << 4) | (_b))
Packit 1fb8d4
Packit 1fb8d4
#define FREERDP_PIXEL_FORMAT_TYPE(_format)	(((_format) >> 16) & 0x07)
Packit 1fb8d4
Packit 1fb8d4
/*** Design considerations
Packit 1fb8d4
 *
Packit 1fb8d4
 * The format naming scheme is based on byte position in memory.
Packit 1fb8d4
 * RGBA for example names a byte array with red on positon 0, green on 1 etc.
Packit 1fb8d4
 *
Packit 1fb8d4
 * To read and write the appropriate format from / to memory use ReadColor and
Packit 1fb8d4
 * WriteColor.
Packit 1fb8d4
 *
Packit 1fb8d4
 * The single pixel manipulation functions use an intermediate integer representation
Packit 1fb8d4
 * that must not be interpreted outside the functions as it is platform dependent.
Packit 1fb8d4
 *
Packit 1fb8d4
 * X for alpha channel denotes unused (but existing) alpha channel data.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
/* 32bpp formats */
Packit 1fb8d4
#define PIXEL_FORMAT_ARGB32	FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_ARGB, 8, 8, 8, 8)
Packit 1fb8d4
#define PIXEL_FORMAT_XRGB32	FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_ARGB, 0, 8, 8, 8)
Packit 1fb8d4
#define PIXEL_FORMAT_ABGR32	FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_ABGR, 8, 8, 8, 8)
Packit 1fb8d4
#define PIXEL_FORMAT_XBGR32	FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_ABGR, 0, 8, 8, 8)
Packit 1fb8d4
#define PIXEL_FORMAT_BGRA32	FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_BGRA, 8, 8, 8, 8)
Packit 1fb8d4
#define PIXEL_FORMAT_BGRX32	FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_BGRA, 0, 8, 8, 8)
Packit 1fb8d4
#define PIXEL_FORMAT_RGBA32	FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_RGBA, 8, 8, 8, 8)
Packit 1fb8d4
#define PIXEL_FORMAT_RGBX32	FREERDP_PIXEL_FORMAT(32, FREERDP_PIXEL_FORMAT_TYPE_RGBA, 0, 8, 8, 8)
Packit 1fb8d4
Packit 1fb8d4
/* 24bpp formats */
Packit 1fb8d4
#define PIXEL_FORMAT_RGB24	FREERDP_PIXEL_FORMAT(24, FREERDP_PIXEL_FORMAT_TYPE_ARGB, 0, 8, 8, 8)
Packit 1fb8d4
#define PIXEL_FORMAT_BGR24	FREERDP_PIXEL_FORMAT(24, FREERDP_PIXEL_FORMAT_TYPE_ABGR, 0, 8, 8, 8)
Packit 1fb8d4
Packit 1fb8d4
/* 16bpp formats */
Packit 1fb8d4
#define PIXEL_FORMAT_RGB16	FREERDP_PIXEL_FORMAT(16, FREERDP_PIXEL_FORMAT_TYPE_ARGB, 0, 5, 6, 5)
Packit 1fb8d4
#define PIXEL_FORMAT_BGR16	FREERDP_PIXEL_FORMAT(16, FREERDP_PIXEL_FORMAT_TYPE_ABGR, 0, 5, 6, 5)
Packit 1fb8d4
#define PIXEL_FORMAT_ARGB15	FREERDP_PIXEL_FORMAT(16, FREERDP_PIXEL_FORMAT_TYPE_ARGB, 1, 5, 5, 5)
Packit 1fb8d4
#define PIXEL_FORMAT_RGB15	FREERDP_PIXEL_FORMAT(15, FREERDP_PIXEL_FORMAT_TYPE_ARGB, 0, 5, 5, 5)
Packit 1fb8d4
#define PIXEL_FORMAT_ABGR15	FREERDP_PIXEL_FORMAT(16, FREERDP_PIXEL_FORMAT_TYPE_ABGR, 1, 5, 5, 5)
Packit 1fb8d4
#define PIXEL_FORMAT_BGR15	FREERDP_PIXEL_FORMAT(15, FREERDP_PIXEL_FORMAT_TYPE_ABGR, 0, 5, 5, 5)
Packit 1fb8d4
Packit 1fb8d4
/* 8bpp formats */
Packit 1fb8d4
#define PIXEL_FORMAT_RGB8	FREERDP_PIXEL_FORMAT(8, FREERDP_PIXEL_FORMAT_TYPE_A, 8, 0, 0, 0)
Packit 1fb8d4
Packit 1fb8d4
/* 4 bpp formats */
Packit 1fb8d4
#define PIXEL_FORMAT_A4	FREERDP_PIXEL_FORMAT(4, FREERDP_PIXEL_FORMAT_TYPE_A, 4, 0, 0, 0)
Packit 1fb8d4
Packit 1fb8d4
/* 1bpp formats */
Packit 1fb8d4
#define PIXEL_FORMAT_MONO	FREERDP_PIXEL_FORMAT(1, FREERDP_PIXEL_FORMAT_TYPE_A, 1, 0, 0, 0)
Packit 1fb8d4
Packit 1fb8d4
struct gdi_palette
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 format;
Packit 1fb8d4
	UINT32 palette[256];
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct gdi_palette gdiPalette;
Packit 1fb8d4
Packit 1fb8d4
#ifdef __cplusplus
Packit 1fb8d4
extern "C" {
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
/* Compare two color formats but ignore differences in alpha channel.
Packit 1fb8d4
 */
Packit 1fb8d4
static INLINE DWORD AreColorFormatsEqualNoAlpha(DWORD first, DWORD second)
Packit 1fb8d4
{
Packit 1fb8d4
	const DWORD mask = ~(8 << 12);
Packit 1fb8d4
	return (first & mask) == (second & mask);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/* Color Space Conversions: http://msdn.microsoft.com/en-us/library/ff566496/ */
Packit 1fb8d4
Packit 1fb8d4
/***
Packit 1fb8d4
 *
Packit 1fb8d4
 * Get a string representation of a color
Packit 1fb8d4
 *
Packit 1fb8d4
 * @param format The pixel color format
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return A string representation of format
Packit 1fb8d4
 */
Packit 1fb8d4
static const char* FreeRDPGetColorFormatName(UINT32 format)
Packit 1fb8d4
{
Packit 1fb8d4
	switch (format)
Packit 1fb8d4
	{
Packit 1fb8d4
		/* 32bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_ARGB32:
Packit 1fb8d4
			return "PIXEL_FORMAT_ARGB32";
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_XRGB32:
Packit 1fb8d4
			return "PIXEL_FORMAT_XRGB32";
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_ABGR32:
Packit 1fb8d4
			return "PIXEL_FORMAT_ABGR32";
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_XBGR32:
Packit 1fb8d4
			return "PIXEL_FORMAT_XBGR32";
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_BGRA32:
Packit 1fb8d4
			return "PIXEL_FORMAT_BGRA32";
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_BGRX32:
Packit 1fb8d4
			return "PIXEL_FORMAT_BGRX32";
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_RGBA32:
Packit 1fb8d4
			return "PIXEL_FORMAT_RGBA32";
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_RGBX32:
Packit 1fb8d4
			return "PIXEL_FORMAT_RGBX32";
Packit 1fb8d4
Packit 1fb8d4
		/* 24bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_RGB24:
Packit 1fb8d4
			return "PIXEL_FORMAT_RGB24";
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_BGR24:
Packit 1fb8d4
			return "PIXEL_FORMAT_BGR24";
Packit 1fb8d4
Packit 1fb8d4
		/* 16bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_RGB16:
Packit 1fb8d4
			return "PIXEL_FORMAT_RGB16";
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_BGR16:
Packit 1fb8d4
			return "PIXEL_FORMAT_BGR16";
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_ARGB15:
Packit 1fb8d4
			return "PIXEL_FORMAT_ARGB15";
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_RGB15:
Packit 1fb8d4
			return "PIXEL_FORMAT_RGB15";
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_ABGR15:
Packit 1fb8d4
			return "PIXEL_FORMAT_ABGR15";
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_BGR15:
Packit 1fb8d4
			return "PIXEL_FORMAT_BGR15";
Packit 1fb8d4
Packit 1fb8d4
		/* 8bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_RGB8:
Packit 1fb8d4
			return "PIXEL_FORMAT_RGB8";
Packit 1fb8d4
Packit 1fb8d4
		/* 4 bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_A4:
Packit 1fb8d4
			return "PIXEL_FORMAT_A4";
Packit 1fb8d4
Packit 1fb8d4
		/* 1bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_MONO:
Packit 1fb8d4
			return "PIXEL_FORMAT_MONO";
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return "UNKNOWN";
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/***
Packit 1fb8d4
 *
Packit 1fb8d4
 * Converts a pixel color in internal representation to its red, green, blue
Packit 1fb8d4
 * and alpha components.
Packit 1fb8d4
 *
Packit 1fb8d4
 * @param color  The color in format internal representation
Packit 1fb8d4
 * @param format one of PIXEL_FORMAT_* color format defines
Packit 1fb8d4
 * @param _r      red color value
Packit 1fb8d4
 * @param _g      green color value
Packit 1fb8d4
 * @param _b      blue color value
Packit 1fb8d4
 * @param _a      alpha color value
Packit 1fb8d4
 * @param palette pallete to use (only used for 8 bit color!)
Packit 1fb8d4
 */
Packit 1fb8d4
static INLINE void SplitColor(UINT32 color, UINT32 format, BYTE* _r, BYTE* _g,
Packit 1fb8d4
                              BYTE* _b, BYTE* _a, const gdiPalette* palette)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 tmp;
Packit 1fb8d4
Packit 1fb8d4
	switch (format)
Packit 1fb8d4
	{
Packit 1fb8d4
		/* 32bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_ARGB32:
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = (BYTE)(color >> 24);
Packit 1fb8d4
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (BYTE)(color >> 16);
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (BYTE)(color >> 8);
Packit 1fb8d4
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (BYTE)color;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_XRGB32:
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (BYTE)(color >> 16);
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (BYTE)(color >> 8);
Packit 1fb8d4
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (BYTE)color;
Packit 1fb8d4
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = 0xFF;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_ABGR32:
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = (BYTE)(color >> 24);
Packit 1fb8d4
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (BYTE)(color >> 16);
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (BYTE)(color >> 8);
Packit 1fb8d4
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (BYTE)color;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_XBGR32:
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (BYTE)(color >> 16);
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (BYTE)(color >> 8);
Packit 1fb8d4
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (BYTE)color;
Packit 1fb8d4
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = 0xFF;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_RGBA32:
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (BYTE)(color >> 24);
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (BYTE)(color >> 16);
Packit 1fb8d4
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (BYTE)(color >> 8);
Packit 1fb8d4
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = (BYTE)color;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_RGBX32:
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (BYTE)(color >> 24);
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (BYTE)(color >> 16);
Packit 1fb8d4
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (BYTE)(color >> 8);
Packit 1fb8d4
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = 0xFF;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_BGRA32:
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (BYTE)(color >> 24);
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (BYTE)(color >> 16);
Packit 1fb8d4
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (BYTE)(color >> 8);
Packit 1fb8d4
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = (BYTE)color;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_BGRX32:
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (BYTE)(color >> 24);
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (BYTE)(color >> 16);
Packit 1fb8d4
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (BYTE)(color >> 8);
Packit 1fb8d4
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = 0xFF;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		/* 24bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_RGB24:
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (BYTE)(color >> 16);
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (BYTE)(color >> 8);
Packit 1fb8d4
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (BYTE)color;
Packit 1fb8d4
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = 0xFF;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_BGR24:
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (BYTE)(color >> 16);
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (BYTE)(color >> 8);
Packit 1fb8d4
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (BYTE)color;
Packit 1fb8d4
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = 0xFF;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		/* 16bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_RGB16:
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (BYTE)(((color >> 11) & 0x1F) << 3);
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (BYTE)(((color >> 5) & 0x3F) << 2);
Packit 1fb8d4
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (BYTE)((color & 0x1F) << 3);
Packit 1fb8d4
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = 0xFF;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_BGR16:
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (BYTE)(((color >> 11) & 0x1F) << 3);
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (BYTE)(((color >> 5) & 0x3F) << 2);
Packit 1fb8d4
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (BYTE)((color & 0x1F) << 3);
Packit 1fb8d4
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = 0xFF;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_ARGB15:
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (BYTE)(((color >> 10) & 0x1F) << 3);
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (BYTE)(((color >> 5) & 0x1F) << 3);
Packit 1fb8d4
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (BYTE)((color & 0x1F) << 3);
Packit 1fb8d4
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = color & 0x8000 ? 0xFF : 0x00;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_ABGR15:
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (BYTE)(((color >> 10) & 0x1F) << 3);
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (BYTE)(((color >> 5) & 0x1F) << 3);
Packit 1fb8d4
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (BYTE)((color & 0x1F) << 3);
Packit 1fb8d4
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = color & 0x8000 ? 0xFF : 0x00;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		/* 15bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_RGB15:
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (BYTE)(((color >> 10) & 0x1F) << 3);
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (BYTE)(((color >> 5) & 0x1F) << 3);
Packit 1fb8d4
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (BYTE)((color & 0x1F) << 3);
Packit 1fb8d4
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = 0xFF;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_BGR15:
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (BYTE)(((color >> 10) & 0x1F) << 3);
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (BYTE)(((color >> 5) & 0x1F) << 3);
Packit 1fb8d4
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (BYTE)((color & 0x1F) << 3);
Packit 1fb8d4
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = 0xFF;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		/* 8bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_RGB8:
Packit 1fb8d4
			if (color <= 0xFF)
Packit 1fb8d4
			{
Packit 1fb8d4
				tmp = palette->palette[color];
Packit 1fb8d4
				SplitColor(tmp, palette->format, _r, _g, _b, _a, NULL);
Packit 1fb8d4
			}
Packit 1fb8d4
			else
Packit 1fb8d4
			{
Packit 1fb8d4
				if (_r)
Packit 1fb8d4
					*_r = 0x00;
Packit 1fb8d4
Packit 1fb8d4
				if (_g)
Packit 1fb8d4
					*_g = 0x00;
Packit 1fb8d4
Packit 1fb8d4
				if (_b)
Packit 1fb8d4
					*_b = 0x00;
Packit 1fb8d4
Packit 1fb8d4
				if (_a)
Packit 1fb8d4
					*_a = 0x00;
Packit 1fb8d4
			}
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		/* 1bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_MONO:
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = (color) ? 0xFF : 0x00;
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = (color) ? 0xFF : 0x00;
Packit 1fb8d4
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = (color) ? 0xFF : 0x00;
Packit 1fb8d4
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = (color) ? 0xFF : 0x00;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		/* 4 bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_A4:
Packit 1fb8d4
		default:
Packit 1fb8d4
			if (_r)
Packit 1fb8d4
				*_r = 0x00;
Packit 1fb8d4
Packit 1fb8d4
			if (_g)
Packit 1fb8d4
				*_g = 0x00;
Packit 1fb8d4
Packit 1fb8d4
			if (_b)
Packit 1fb8d4
				*_b = 0x00;
Packit 1fb8d4
Packit 1fb8d4
			if (_a)
Packit 1fb8d4
				*_a = 0x00;
Packit 1fb8d4
Packit 1fb8d4
			WLog_ERR(CTAG, "Unsupported format %s", FreeRDPGetColorFormatName(format));
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/***
Packit 1fb8d4
 *
Packit 1fb8d4
 * Converts red, green, blue and alpha values to internal representation.
Packit 1fb8d4
 *
Packit 1fb8d4
 * @param format one of PIXEL_FORMAT_* color format defines
Packit 1fb8d4
 * @param r      red color value
Packit 1fb8d4
 * @param g      green color value
Packit 1fb8d4
 * @param b      blue color value
Packit 1fb8d4
 * @param a      alpha color value
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return       The pixel color in the desired format. Value is in internal
Packit 1fb8d4
 *               representation.
Packit 1fb8d4
 */
Packit 1fb8d4
static INLINE UINT32 FreeRDPGetColor(UINT32 format, BYTE r, BYTE g, BYTE b, BYTE a)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 _r = r;
Packit 1fb8d4
	UINT32 _g = g;
Packit 1fb8d4
	UINT32 _b = b;
Packit 1fb8d4
	UINT32 _a = a;
Packit 1fb8d4
Packit 1fb8d4
	switch (format)
Packit 1fb8d4
	{
Packit 1fb8d4
		/* 32bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_ARGB32:
Packit 1fb8d4
			return (_a << 24) | (_r << 16) | (_g << 8) | _b;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_XRGB32:
Packit 1fb8d4
			return (_r << 16) | (_g << 8) | _b;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_ABGR32:
Packit 1fb8d4
			return (_a << 24) | (_b << 16) | (_g << 8) | _r;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_XBGR32:
Packit 1fb8d4
			return (_b << 16) | (_g << 8) | _r;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_RGBA32:
Packit 1fb8d4
			return (_r << 24) | (_g << 16) | (_b << 8) | _a;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_RGBX32:
Packit 1fb8d4
			return (_r << 24) | (_g << 16) | (_b << 8) | _a;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_BGRA32:
Packit 1fb8d4
			return (_b << 24) | (_g << 16) | (_r << 8) | _a;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_BGRX32:
Packit 1fb8d4
			return (_b << 24) | (_g << 16) | (_r << 8) | _a;
Packit 1fb8d4
Packit 1fb8d4
		/* 24bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_RGB24:
Packit 1fb8d4
			return (_r << 16) | (_g << 8) | _b;
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_BGR24:
Packit 1fb8d4
			return (_b << 16) | (_g << 8) | _r;
Packit 1fb8d4
Packit 1fb8d4
		/* 16bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_RGB16:
Packit 1fb8d4
			return (((_r >> 3) & 0x1F) << 11) | (((_g >> 2) & 0x3F) << 5) | ((
Packit 1fb8d4
			            _b >> 3) & 0x1F);
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_BGR16:
Packit 1fb8d4
			return (((_b >> 3) & 0x1F) << 11) | (((_g >> 2) & 0x3F) << 5) | ((
Packit 1fb8d4
			            _r >> 3) & 0x1F);
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_ARGB15:
Packit 1fb8d4
			return (((_r >> 3) & 0x1F) << 10) | (((_g >> 3) & 0x1F) << 5) | ((
Packit 1fb8d4
			            _b >> 3) & 0x1F) | (_a ? 0x8000 : 0x0000);
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_ABGR15:
Packit 1fb8d4
			return (((_b >> 3) & 0x1F) << 10) | (((_g >> 3) & 0x1F) << 5) | ((
Packit 1fb8d4
			            _r >> 3) & 0x1F) | (_a ? 0x8000 : 0x0000);
Packit 1fb8d4
Packit 1fb8d4
		/* 15bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_RGB15:
Packit 1fb8d4
			return (((_r >> 3) & 0x1F) << 10) | (((_g >> 3) & 0x1F) << 5) | ((
Packit 1fb8d4
			            _b >> 3) & 0x1F);
Packit 1fb8d4
Packit 1fb8d4
		case PIXEL_FORMAT_BGR15:
Packit 1fb8d4
			return (((_b >> 3) & 0x1F) << 10) | (((_g >> 3) & 0x1F) << 5) | ((
Packit 1fb8d4
			            _r >> 3) & 0x1F);
Packit 1fb8d4
Packit 1fb8d4
		/* 8bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_RGB8:
Packit 1fb8d4
Packit 1fb8d4
		/* 4 bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_A4:
Packit 1fb8d4
Packit 1fb8d4
		/* 1bpp formats */
Packit 1fb8d4
		case PIXEL_FORMAT_MONO:
Packit 1fb8d4
		default:
Packit 1fb8d4
			WLog_ERR(CTAG, "Unsupported format %s", FreeRDPGetColorFormatName(format));
Packit 1fb8d4
			return 0;
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/***
Packit 1fb8d4
 *
Packit 1fb8d4
 * Returns the number of bits the format format uses.
Packit 1fb8d4
 *
Packit 1fb8d4
 * @param format One of PIXEL_FORMAT_* defines
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return The number of bits the format requires per pixel.
Packit 1fb8d4
 */
Packit 1fb8d4
static INLINE UINT32 GetBitsPerPixel(UINT32 format)
Packit 1fb8d4
{
Packit 1fb8d4
	return (((format) >> 24) & 0x3F);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/***
Packit 1fb8d4
 * @param format one of PIXEL_FORMAT_* color format defines
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return TRUE if the format has an alpha channel, FALSE otherwise.
Packit 1fb8d4
 */
Packit 1fb8d4
static INLINE BOOL ColorHasAlpha(UINT32 format)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 alpha = (((format) >> 12) & 0x0F);
Packit 1fb8d4
Packit 1fb8d4
	if (alpha == 0)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/***
Packit 1fb8d4
 *
Packit 1fb8d4
 * Read a pixel from memory to internal representation
Packit 1fb8d4
 *
Packit 1fb8d4
 * @param src    The source buffer
Packit 1fb8d4
 * @param format The PIXEL_FORMAT_* define the source buffer uses for encoding
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return The pixel color in internal representation
Packit 1fb8d4
 */
Packit 1fb8d4
static INLINE UINT32 ReadColor(const BYTE* src, UINT32 format)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 color;
Packit 1fb8d4
Packit 1fb8d4
	switch (GetBitsPerPixel(format))
Packit 1fb8d4
	{
Packit 1fb8d4
		case 32:
Packit 1fb8d4
			color = ((UINT32)src[0] << 24) | ((UINT32)src[1] << 16) |
Packit 1fb8d4
			        ((UINT32)src[2] << 8) | src[3];
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 24:
Packit 1fb8d4
			color = ((UINT32)src[0] << 16) | ((UINT32)src[1] << 8) | src[2];
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 16:
Packit 1fb8d4
			color = ((UINT32)src[1] << 8) | src[0];
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 15:
Packit 1fb8d4
			color = ((UINT32)src[1] << 8) | src[0];
Packit 1fb8d4
Packit 1fb8d4
			if (!ColorHasAlpha(format))
Packit 1fb8d4
				color = color & 0x7FFF;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 8:
Packit 1fb8d4
		case 4:
Packit 1fb8d4
		case 1:
Packit 1fb8d4
			color = *src;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			WLog_ERR(CTAG, "Unsupported format %s", FreeRDPGetColorFormatName(format));
Packit 1fb8d4
			color = 0;
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return color;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/***
Packit 1fb8d4
 *
Packit 1fb8d4
 * Write a pixel from internal representation to memory
Packit 1fb8d4
 *
Packit 1fb8d4
 * @param dst    The destination buffer
Packit 1fb8d4
 * @param format The PIXEL_FORMAT_* define for encoding
Packit 1fb8d4
 * @param color  The pixel color in internal representation
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return TRUE if successful, FALSE otherwise
Packit 1fb8d4
 */
Packit 1fb8d4
static INLINE BOOL WriteColor(BYTE* dst, UINT32 format, UINT32 color)
Packit 1fb8d4
{
Packit 1fb8d4
	switch (GetBitsPerPixel(format))
Packit 1fb8d4
	{
Packit 1fb8d4
		case 32:
Packit 1fb8d4
			dst[0] = (BYTE)(color >> 24);
Packit 1fb8d4
			dst[1] = (BYTE)(color >> 16);
Packit 1fb8d4
			dst[2] = (BYTE)(color >> 8);
Packit 1fb8d4
			dst[3] = (BYTE)color;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 24:
Packit 1fb8d4
			dst[0] = (BYTE)(color >> 16);
Packit 1fb8d4
			dst[1] = (BYTE)(color >> 8);
Packit 1fb8d4
			dst[2] = (BYTE)color;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 16:
Packit 1fb8d4
			dst[1] = (BYTE)(color >> 8);
Packit 1fb8d4
			dst[0] = (BYTE)color;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 15:
Packit 1fb8d4
			if (!ColorHasAlpha(format))
Packit 1fb8d4
				color = color & 0x7FFF;
Packit 1fb8d4
Packit 1fb8d4
			dst[1] = (BYTE)(color >> 8);
Packit 1fb8d4
			dst[0] = (BYTE)color;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 8:
Packit 1fb8d4
			dst[0] = (BYTE)color;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			WLog_ERR(CTAG, "Unsupported format %s", FreeRDPGetColorFormatName(format));
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/***
Packit 1fb8d4
 *
Packit 1fb8d4
 * Converts a pixel in internal representation format srcFormat to internal
Packit 1fb8d4
 * representation format dstFormat
Packit 1fb8d4
 *
Packit 1fb8d4
 * @param color      The pixel color in srcFormat representation
Packit 1fb8d4
 * @param srcFormat  The PIXEL_FORMAT_* of color
Packit 1fb8d4
 * @param dstFormat  The PIXEL_FORMAT_* of the return.
Packit 1fb8d4
 * @param palette    pallete to use (only used for 8 bit color!)
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return           The converted pixel color in dstFormat representation
Packit 1fb8d4
 */
Packit 1fb8d4
static INLINE UINT32 FreeRDPConvertColor(UINT32 color, UINT32 srcFormat,
Packit 1fb8d4
                                  UINT32 dstFormat, const gdiPalette* palette)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE r = 0;
Packit 1fb8d4
	BYTE g = 0;
Packit 1fb8d4
	BYTE b = 0;
Packit 1fb8d4
	BYTE a = 0;
Packit 1fb8d4
	SplitColor(color, srcFormat, &r, &g, &b, &a, palette);
Packit 1fb8d4
	return FreeRDPGetColor(dstFormat, r, g, b, a);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/***
Packit 1fb8d4
 *
Packit 1fb8d4
 * Returns the number of bytes the format format uses.
Packit 1fb8d4
 *
Packit 1fb8d4
 * @param format One of PIXEL_FORMAT_* defines
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return The number of bytes the format requires per pixel.
Packit 1fb8d4
 */
Packit 1fb8d4
static INLINE UINT32 GetBytesPerPixel(UINT32 format)
Packit 1fb8d4
{
Packit 1fb8d4
	return (GetBitsPerPixel(format) + 7) / 8;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/***
Packit 1fb8d4
 *
Packit 1fb8d4
 * @param nWidth    width to copy in pixels
Packit 1fb8d4
 * @param nHeight   height to copy in pixels
Packit 1fb8d4
 * @param data      source buffer, must be (nWidth + 7) / 8 bytes long
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return          A buffer allocated with _aligned_malloc(width * height, 16)
Packit 1fb8d4
 *                  if successufl, NULL otherwise.
Packit 1fb8d4
 */
Packit 1fb8d4
FREERDP_API BYTE* freerdp_glyph_convert(UINT32 width, UINT32 height,
Packit 1fb8d4
                                        const BYTE* data);
Packit 1fb8d4
Packit 1fb8d4
/***
Packit 1fb8d4
 *
Packit 1fb8d4
 * @param pDstData  destination buffer
Packit 1fb8d4
 * @param DstFormat destination buffer format
Packit 1fb8d4
 * @param nDstStep  destination buffer stride (line in bytes) 0 for default
Packit 1fb8d4
 * @param nXDst     destination buffer offset x
Packit 1fb8d4
 * @param nYDst     destination buffer offset y
Packit 1fb8d4
 * @param nWidth    width to copy in pixels
Packit 1fb8d4
 * @param nHeight   height to copy in pixels
Packit 1fb8d4
 * @param pSrcData  source buffer, must be (nWidth + 7) / 8 bytes long
Packit 1fb8d4
 * @param backColor The background color in internal representation format
Packit 1fb8d4
 * @param foreColor The foreground color in internal representation format
Packit 1fb8d4
 * @param palette   palette to use (only used for 8 bit color!)
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return          TRUE if success, FALSE otherwise
Packit 1fb8d4
 */
Packit 1fb8d4
FREERDP_API BOOL freerdp_image_copy_from_monochrome(BYTE* pDstData,
Packit 1fb8d4
        UINT32 DstFormat,
Packit 1fb8d4
        UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst,
Packit 1fb8d4
        UINT32 nWidth, UINT32 nHeight,
Packit 1fb8d4
        const BYTE* pSrcData,
Packit 1fb8d4
        UINT32 backColor, UINT32 foreColor,
Packit 1fb8d4
        const gdiPalette* palette);
Packit 1fb8d4
Packit 1fb8d4
/***
Packit 1fb8d4
 *
Packit 1fb8d4
 * @param pDstData      destination buffer
Packit 1fb8d4
 * @param DstFormat     destination buffer format
Packit 1fb8d4
 * @param nDstStep      destination buffer stride (line in bytes) 0 for default
Packit 1fb8d4
 * @param nXDst         destination buffer offset x
Packit 1fb8d4
 * @param nYDst         destination buffer offset y
Packit 1fb8d4
 * @param nWidth        width to copy in pixels
Packit 1fb8d4
 * @param nHeight       height to copy in pixels
Packit 1fb8d4
 * @param xorMask       XOR mask buffer
Packit 1fb8d4
 * @param xorMaskLength XOR mask length in bytes
Packit 1fb8d4
 * @param andMask       AND mask buffer
Packit 1fb8d4
 * @param andMaskLength AND mask length in bytes
Packit 1fb8d4
 * @param xorBpp        XOR bits per pixel
Packit 1fb8d4
 * @param palette       palette to use (only used for 8 bit color!)
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return              TRUE if success, FALSE otherwise
Packit 1fb8d4
 */
Packit 1fb8d4
FREERDP_API BOOL freerdp_image_copy_from_pointer_data(
Packit 1fb8d4
    BYTE* pDstData, UINT32 DstFormat, UINT32 nDstStep,
Packit 1fb8d4
    UINT32 nXDst, UINT32 nYDst, UINT32 nWidth, UINT32 nHeight,
Packit 1fb8d4
    const BYTE* xorMask, UINT32 xorMaskLength,
Packit 1fb8d4
    const BYTE* andMask, UINT32 andMaskLength,
Packit 1fb8d4
    UINT32 xorBpp, const gdiPalette* palette);
Packit 1fb8d4
Packit 1fb8d4
/***
Packit 1fb8d4
 *
Packit 1fb8d4
 * @param pDstData  destination buffer
Packit 1fb8d4
 * @param DstFormat destination buffer format
Packit 1fb8d4
 * @param nDstStep  destination buffer stride (line in bytes) 0 for default
Packit 1fb8d4
 * @param nXDst     destination buffer offset x
Packit 1fb8d4
 * @param nYDst     destination buffer offset y
Packit 1fb8d4
 * @param nWidth    width to copy in pixels
Packit 1fb8d4
 * @param nHeight   height to copy in pixels
Packit 1fb8d4
 * @param pSrcData  source buffer
Packit 1fb8d4
 * @param SrcFormat source buffer format
Packit 1fb8d4
 * @param nSrcStep  source buffer stride (line in bytes) 0 for default
Packit 1fb8d4
 * @param nXSrc     source buffer x offset in pixels
Packit 1fb8d4
 * @param nYSrc     source buffer y offset in pixels
Packit 1fb8d4
 * @param palette   palette to use (only used for 8 bit color!)
Packit 1fb8d4
 * @param flags     Image flipping flags FREERDP_FLIP_NONE et al
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return          TRUE if success, FALSE otherwise
Packit 1fb8d4
 */
Packit 1fb8d4
FREERDP_API BOOL freerdp_image_copy(BYTE* pDstData, DWORD DstFormat,
Packit 1fb8d4
                                    UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst,
Packit 1fb8d4
                                    UINT32 nWidth, UINT32 nHeight,
Packit 1fb8d4
                                    const BYTE* pSrcData, DWORD SrcFormat,
Packit 1fb8d4
                                    UINT32 nSrcStep, UINT32 nXSrc, UINT32 nYSrc,
Packit 1fb8d4
                                    const gdiPalette* palette, UINT32 flags);
Packit 1fb8d4
Packit 1fb8d4
/***
Packit 1fb8d4
 *
Packit 1fb8d4
 * @param pDstData  destionation buffer
Packit 1fb8d4
 * @param DstFormat destionation buffer format
Packit 1fb8d4
 * @param nDstStep  destionation buffer stride (line in bytes) 0 for default
Packit 1fb8d4
 * @param nXDst     destination buffer offset x
Packit 1fb8d4
 * @param nYDst     destination buffer offset y
Packit 1fb8d4
 * @param nWidth    width to copy in pixels
Packit 1fb8d4
 * @param nHeight   height to copy in pixels
Packit 1fb8d4
 * @param color     Pixel color in DstFormat (internal representation format,
Packit 1fb8d4
 *                  use FreeRDPGetColor to create)
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return          TRUE if success, FALSE otherwise
Packit 1fb8d4
 */
Packit 1fb8d4
FREERDP_API BOOL freerdp_image_fill(BYTE* pDstData, DWORD DstFormat,
Packit 1fb8d4
                                    UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst,
Packit 1fb8d4
                                    UINT32 nWidth, UINT32 nHeight, UINT32 color);
Packit 1fb8d4
Packit 1fb8d4
#if !defined(__APPLE__)
Packit 1fb8d4
#define GetColorFormatName FreeRDPGetColorFormatName
Packit 1fb8d4
#define GetColor FreeRDPGetColor
Packit 1fb8d4
#define ConvertColor FreeRDPConvertColor
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#ifdef __cplusplus
Packit 1fb8d4
}
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#endif /* FREERDP_CODEC_COLOR_H */