2011-07-01 00:17:55 +04:00
|
|
|
/**
|
2012-10-09 07:02:04 +04:00
|
|
|
* FreeRDP: A Remote Desktop Protocol Implementation
|
2011-07-01 00:17:55 +04:00
|
|
|
* GDI Library
|
|
|
|
*
|
|
|
|
* Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2012-12-14 09:25:48 +04:00
|
|
|
#ifndef FREERDP_GDI_H
|
|
|
|
#define FREERDP_GDI_H
|
2011-07-01 00:17:55 +04:00
|
|
|
|
2011-08-17 07:54:42 +04:00
|
|
|
#include <freerdp/api.h>
|
2014-09-12 16:36:29 +04:00
|
|
|
#include <freerdp/log.h>
|
2011-07-01 00:17:55 +04:00
|
|
|
#include <freerdp/freerdp.h>
|
2011-08-17 07:54:42 +04:00
|
|
|
#include <freerdp/cache/cache.h>
|
2011-10-03 04:28:20 +04:00
|
|
|
#include <freerdp/codec/color.h>
|
2014-09-12 22:57:44 +04:00
|
|
|
#include <freerdp/codec/region.h>
|
|
|
|
|
|
|
|
#include <freerdp/client/rdpgfx.h>
|
2011-07-01 00:17:55 +04:00
|
|
|
|
|
|
|
/* For more information, see [MS-RDPEGDI] */
|
|
|
|
|
|
|
|
/* Binary Raster Operations (ROP2) */
|
|
|
|
#define GDI_R2_BLACK 0x01 /* D = 0 */
|
|
|
|
#define GDI_R2_NOTMERGEPEN 0x02 /* D = ~(D | P) */
|
|
|
|
#define GDI_R2_MASKNOTPEN 0x03 /* D = D & ~P */
|
|
|
|
#define GDI_R2_NOTCOPYPEN 0x04 /* D = ~P */
|
|
|
|
#define GDI_R2_MASKPENNOT 0x05 /* D = P & ~D */
|
|
|
|
#define GDI_R2_NOT 0x06 /* D = ~D */
|
|
|
|
#define GDI_R2_XORPEN 0x07 /* D = D ^ P */
|
|
|
|
#define GDI_R2_NOTMASKPEN 0x08 /* D = ~(D & P) */
|
|
|
|
#define GDI_R2_MASKPEN 0x09 /* D = D & P */
|
|
|
|
#define GDI_R2_NOTXORPEN 0x0A /* D = ~(D ^ P) */
|
|
|
|
#define GDI_R2_NOP 0x0B /* D = D */
|
|
|
|
#define GDI_R2_MERGENOTPEN 0x0C /* D = D | ~P */
|
|
|
|
#define GDI_R2_COPYPEN 0x0D /* D = P */
|
|
|
|
#define GDI_R2_MERGEPENNOT 0x0E /* D = P | ~D */
|
|
|
|
#define GDI_R2_MERGEPEN 0x0F /* D = P | D */
|
|
|
|
#define GDI_R2_WHITE 0x10 /* D = 1 */
|
|
|
|
|
|
|
|
/* Ternary Raster Operations (ROP3) */
|
|
|
|
#define GDI_SRCCOPY 0x00CC0020 /* D = S */
|
|
|
|
#define GDI_SRCPAINT 0x00EE0086 /* D = S | D */
|
|
|
|
#define GDI_SRCAND 0x008800C6 /* D = S & D */
|
|
|
|
#define GDI_SRCINVERT 0x00660046 /* D = S ^ D */
|
|
|
|
#define GDI_SRCERASE 0x00440328 /* D = S & ~D */
|
|
|
|
#define GDI_NOTSRCCOPY 0x00330008 /* D = ~S */
|
|
|
|
#define GDI_NOTSRCERASE 0x001100A6 /* D = ~S & ~D */
|
|
|
|
#define GDI_MERGECOPY 0x00C000CA /* D = S & P */
|
|
|
|
#define GDI_MERGEPAINT 0x00BB0226 /* D = ~S | D */
|
|
|
|
#define GDI_PATCOPY 0x00F00021 /* D = P */
|
|
|
|
#define GDI_PATPAINT 0x00FB0A09 /* D = D | (P | ~S) */
|
|
|
|
#define GDI_PATINVERT 0x005A0049 /* D = P ^ D */
|
|
|
|
#define GDI_DSTINVERT 0x00550009 /* D = ~D */
|
|
|
|
#define GDI_BLACKNESS 0x00000042 /* D = 0 */
|
|
|
|
#define GDI_WHITENESS 0x00FF0062 /* D = 1 */
|
|
|
|
#define GDI_DSPDxax 0x00E20746 /* D = (S & P) | (~S & D) */
|
2012-02-13 03:12:28 +04:00
|
|
|
#define GDI_PSDPxax 0x00B8074A /* D = (S & D) | (~S & P) */
|
2011-07-01 00:17:55 +04:00
|
|
|
#define GDI_SPna 0x000C0324 /* D = S & ~P */
|
|
|
|
#define GDI_DSna 0x00220326 /* D = D & ~S */
|
2012-02-13 00:21:08 +04:00
|
|
|
#define GDI_DPa 0x00A000C9 /* D = D & P */
|
2011-08-19 22:14:13 +04:00
|
|
|
#define GDI_PDxn 0x00A50065 /* D = D ^ ~P */
|
2011-07-01 00:17:55 +04:00
|
|
|
|
2013-02-04 00:16:37 +04:00
|
|
|
#define GDI_DSxn 0x00990066 /* D = ~(D ^ S) */
|
|
|
|
#define GDI_PSDnox 0x002D060A /* D = P ^ (S | ~D) */
|
|
|
|
#define GDI_PDSona 0x00100C85 /* D = P & ~(D | S) */
|
|
|
|
#define GDI_DSPDxox 0x00740646 /* D = D ^ (S | ( P ^ D)) */
|
|
|
|
#define GDI_DPSDonox 0x005B18A9 /* D = D ^ (P | ~(S | D)) */
|
2013-02-04 20:40:40 +04:00
|
|
|
#define GDI_SPDSxax 0x00AC0744 /* D = S ^ (P & (D ^ S)) */
|
2013-01-29 03:42:32 +04:00
|
|
|
|
2013-02-04 00:16:37 +04:00
|
|
|
#define GDI_DPon 0x000500A9 /* D = ~(D | P) */
|
|
|
|
#define GDI_DPna 0x000A0329 /* D = D & ~P */
|
|
|
|
#define GDI_Pn 0x000F0001 /* D = ~P */
|
|
|
|
#define GDI_PDna 0x00500325 /* D = P &~D */
|
|
|
|
#define GDI_DPan 0x005F00E9 /* D = ~(D & P) */
|
|
|
|
#define GDI_DSan 0x007700E6 /* D = ~(D & S) */
|
|
|
|
#define GDI_DSxn 0x00990066 /* D = ~(D ^ S) */
|
|
|
|
#define GDI_DPa 0x00A000C9 /* D = D & P */
|
|
|
|
#define GDI_D 0x00AA0029 /* D = D */
|
|
|
|
#define GDI_DPno 0x00AF0229 /* D = D | ~P */
|
|
|
|
#define GDI_SDno 0x00DD0228 /* D = S | ~D */
|
|
|
|
#define GDI_PDno 0x00F50225 /* D = P | ~D */
|
|
|
|
#define GDI_DPo 0x00FA0089 /* D = D | P */
|
2012-02-13 03:12:28 +04:00
|
|
|
|
2011-07-01 00:17:55 +04:00
|
|
|
/* Brush Styles */
|
|
|
|
#define GDI_BS_SOLID 0x00
|
|
|
|
#define GDI_BS_NULL 0x01
|
|
|
|
#define GDI_BS_HATCHED 0x02
|
|
|
|
#define GDI_BS_PATTERN 0x03
|
|
|
|
|
|
|
|
/* Hatch Patterns */
|
|
|
|
#define GDI_HS_HORIZONTAL 0x00
|
|
|
|
#define GDI_HS_VERTICAL 0x01
|
|
|
|
#define GDI_HS_FDIAGONAL 0x02
|
|
|
|
#define GDI_HS_BDIAGONAL 0x03
|
|
|
|
#define GDI_HS_CROSS 0x04
|
|
|
|
#define GDI_HS_DIAGCROSS 0x05
|
|
|
|
|
|
|
|
/* Pen Styles */
|
|
|
|
#define GDI_PS_SOLID 0x00
|
|
|
|
#define GDI_PS_DASH 0x01
|
|
|
|
#define GDI_PS_NULL 0x05
|
|
|
|
|
|
|
|
/* Background Modes */
|
|
|
|
#define GDI_OPAQUE 0x00000001
|
|
|
|
#define GDI_TRANSPARENT 0x00000002
|
|
|
|
|
2013-12-10 21:30:25 +04:00
|
|
|
/* Fill Modes */
|
|
|
|
#define GDI_FILL_ALTERNATE 0x01
|
|
|
|
#define GDI_FILL_WINDING 0x02
|
|
|
|
|
2011-07-01 00:17:55 +04:00
|
|
|
/* GDI Object Types */
|
2015-04-26 23:28:49 +03:00
|
|
|
#define GDIOBJECT_BITMAP 0x00
|
|
|
|
#define GDIOBJECT_PEN 0x01
|
|
|
|
#define GDIOBJECT_PALETTE 0x02
|
|
|
|
#define GDIOBJECT_BRUSH 0x03
|
|
|
|
#define GDIOBJECT_RECT 0x04
|
|
|
|
#define GDIOBJECT_REGION 0x05
|
|
|
|
|
|
|
|
/* Region return values */
|
2015-05-07 21:20:49 +03:00
|
|
|
#ifndef NULLREGION
|
2015-04-26 23:28:49 +03:00
|
|
|
#define NULLREGION 0x01
|
|
|
|
#define SIMPLEREGION 0x02
|
|
|
|
#define COMPLEXREGION 0x03
|
2015-05-07 21:20:49 +03:00
|
|
|
#endif
|
2011-07-01 00:17:55 +04:00
|
|
|
|
|
|
|
struct _GDIOBJECT
|
|
|
|
{
|
2012-10-09 11:01:37 +04:00
|
|
|
BYTE objectType;
|
2011-07-01 00:17:55 +04:00
|
|
|
};
|
|
|
|
typedef struct _GDIOBJECT GDIOBJECT;
|
|
|
|
typedef GDIOBJECT* HGDIOBJECT;
|
|
|
|
|
|
|
|
/* RGB encoded as 0x00BBGGRR */
|
|
|
|
typedef unsigned int GDI_COLOR;
|
|
|
|
typedef GDI_COLOR* LPGDI_COLOR;
|
|
|
|
|
|
|
|
struct _GDI_RECT
|
|
|
|
{
|
2012-10-09 11:01:37 +04:00
|
|
|
BYTE objectType;
|
2011-07-01 00:17:55 +04:00
|
|
|
int left;
|
|
|
|
int top;
|
|
|
|
int right;
|
|
|
|
int bottom;
|
|
|
|
};
|
|
|
|
typedef struct _GDI_RECT GDI_RECT;
|
|
|
|
typedef GDI_RECT* HGDI_RECT;
|
|
|
|
|
|
|
|
struct _GDI_RGN
|
|
|
|
{
|
2012-10-09 11:01:37 +04:00
|
|
|
BYTE objectType;
|
2011-07-01 00:17:55 +04:00
|
|
|
int x; /* left */
|
|
|
|
int y; /* top */
|
|
|
|
int w; /* width */
|
|
|
|
int h; /* height */
|
|
|
|
int null; /* null region */
|
|
|
|
};
|
|
|
|
typedef struct _GDI_RGN GDI_RGN;
|
|
|
|
typedef GDI_RGN* HGDI_RGN;
|
|
|
|
|
|
|
|
struct _GDI_BITMAP
|
|
|
|
{
|
2012-10-09 11:01:37 +04:00
|
|
|
BYTE objectType;
|
2011-07-01 00:17:55 +04:00
|
|
|
int bytesPerPixel;
|
|
|
|
int bitsPerPixel;
|
|
|
|
int width;
|
|
|
|
int height;
|
|
|
|
int scanline;
|
2012-10-09 11:01:37 +04:00
|
|
|
BYTE* data;
|
2015-08-12 11:49:59 +03:00
|
|
|
void (*free)(void *);
|
2011-07-01 00:17:55 +04:00
|
|
|
};
|
|
|
|
typedef struct _GDI_BITMAP GDI_BITMAP;
|
|
|
|
typedef GDI_BITMAP* HGDI_BITMAP;
|
|
|
|
|
|
|
|
struct _GDI_PEN
|
|
|
|
{
|
2012-10-09 11:01:37 +04:00
|
|
|
BYTE objectType;
|
2011-07-01 00:17:55 +04:00
|
|
|
int style;
|
|
|
|
int width;
|
|
|
|
int posX;
|
|
|
|
int posY;
|
|
|
|
GDI_COLOR color;
|
|
|
|
};
|
|
|
|
typedef struct _GDI_PEN GDI_PEN;
|
|
|
|
typedef GDI_PEN* HGDI_PEN;
|
|
|
|
|
|
|
|
struct _GDI_PALETTEENTRY
|
|
|
|
{
|
2012-10-09 11:01:37 +04:00
|
|
|
BYTE red;
|
|
|
|
BYTE green;
|
|
|
|
BYTE blue;
|
2011-07-01 00:17:55 +04:00
|
|
|
};
|
|
|
|
typedef struct _GDI_PALETTEENTRY GDI_PALETTEENTRY;
|
|
|
|
|
|
|
|
struct _GDI_PALETTE
|
|
|
|
{
|
2012-10-09 11:01:37 +04:00
|
|
|
UINT16 count;
|
2011-07-01 00:17:55 +04:00
|
|
|
GDI_PALETTEENTRY *entries;
|
|
|
|
};
|
|
|
|
typedef struct _GDI_PALETTE GDI_PALETTE;
|
|
|
|
typedef GDI_PALETTE* HGDI_PALETTE;
|
|
|
|
|
|
|
|
struct _GDI_POINT
|
|
|
|
{
|
|
|
|
int x;
|
|
|
|
int y;
|
|
|
|
};
|
|
|
|
typedef struct _GDI_POINT GDI_POINT;
|
|
|
|
typedef GDI_POINT* HGDI_POINT;
|
|
|
|
|
|
|
|
struct _GDI_BRUSH
|
|
|
|
{
|
2012-10-09 11:01:37 +04:00
|
|
|
BYTE objectType;
|
2011-07-01 00:17:55 +04:00
|
|
|
int style;
|
|
|
|
HGDI_BITMAP pattern;
|
|
|
|
GDI_COLOR color;
|
2015-10-15 21:52:02 +03:00
|
|
|
int nXOrg;
|
|
|
|
int nYOrg;
|
2011-07-01 00:17:55 +04:00
|
|
|
};
|
|
|
|
typedef struct _GDI_BRUSH GDI_BRUSH;
|
|
|
|
typedef GDI_BRUSH* HGDI_BRUSH;
|
|
|
|
|
|
|
|
struct _GDI_WND
|
|
|
|
{
|
2011-08-26 21:37:23 +04:00
|
|
|
int count;
|
2011-08-24 09:47:43 +04:00
|
|
|
int ninvalid;
|
2011-07-01 00:17:55 +04:00
|
|
|
HGDI_RGN invalid;
|
2011-08-26 21:37:23 +04:00
|
|
|
HGDI_RGN cinvalid;
|
2011-07-01 00:17:55 +04:00
|
|
|
};
|
|
|
|
typedef struct _GDI_WND GDI_WND;
|
|
|
|
typedef GDI_WND* HGDI_WND;
|
|
|
|
|
|
|
|
struct _GDI_DC
|
|
|
|
{
|
|
|
|
HGDIOBJECT selectedObject;
|
|
|
|
int bytesPerPixel;
|
|
|
|
int bitsPerPixel;
|
|
|
|
GDI_COLOR bkColor;
|
|
|
|
GDI_COLOR textColor;
|
|
|
|
HGDI_BRUSH brush;
|
|
|
|
HGDI_RGN clip;
|
|
|
|
HGDI_PEN pen;
|
|
|
|
HGDI_WND hwnd;
|
|
|
|
int drawMode;
|
|
|
|
int bkMode;
|
|
|
|
int alpha;
|
|
|
|
int invert;
|
|
|
|
int rgb555;
|
|
|
|
};
|
|
|
|
typedef struct _GDI_DC GDI_DC;
|
|
|
|
typedef GDI_DC* HGDI_DC;
|
|
|
|
|
2011-10-13 23:51:07 +04:00
|
|
|
struct gdi_bitmap
|
2011-07-01 00:17:55 +04:00
|
|
|
{
|
2011-10-13 23:51:07 +04:00
|
|
|
rdpBitmap _p;
|
2011-10-21 01:28:59 +04:00
|
|
|
|
2011-07-01 00:17:55 +04:00
|
|
|
HGDI_DC hdc;
|
|
|
|
HGDI_BITMAP bitmap;
|
|
|
|
HGDI_BITMAP org_bitmap;
|
|
|
|
};
|
2011-10-13 23:51:07 +04:00
|
|
|
typedef struct gdi_bitmap gdiBitmap;
|
2011-07-01 00:17:55 +04:00
|
|
|
|
2011-11-09 08:26:44 +04:00
|
|
|
struct gdi_glyph
|
|
|
|
{
|
|
|
|
rdpBitmap _p;
|
|
|
|
|
|
|
|
HGDI_DC hdc;
|
|
|
|
HGDI_BITMAP bitmap;
|
|
|
|
HGDI_BITMAP org_bitmap;
|
|
|
|
};
|
|
|
|
typedef struct gdi_glyph gdiGlyph;
|
|
|
|
|
2011-10-16 08:50:10 +04:00
|
|
|
struct rdp_gdi
|
2011-07-01 00:17:55 +04:00
|
|
|
{
|
2011-10-16 08:50:10 +04:00
|
|
|
rdpContext* context;
|
|
|
|
|
2011-07-01 00:17:55 +04:00
|
|
|
int width;
|
|
|
|
int height;
|
|
|
|
int dstBpp;
|
|
|
|
int srcBpp;
|
|
|
|
int cursor_x;
|
|
|
|
int cursor_y;
|
|
|
|
int bytesPerPixel;
|
2014-09-10 08:42:41 +04:00
|
|
|
rdpCodecs* codecs;
|
2011-07-01 00:17:55 +04:00
|
|
|
|
2014-09-18 03:44:59 +04:00
|
|
|
BOOL invert;
|
2011-07-01 00:17:55 +04:00
|
|
|
HGDI_DC hdc;
|
2014-09-16 00:08:06 +04:00
|
|
|
UINT32 format;
|
2011-10-13 23:51:07 +04:00
|
|
|
gdiBitmap* primary;
|
|
|
|
gdiBitmap* drawing;
|
2014-09-12 04:46:15 +04:00
|
|
|
UINT32 bitmap_size;
|
|
|
|
BYTE* bitmap_buffer;
|
2012-10-09 11:01:37 +04:00
|
|
|
BYTE* primary_buffer;
|
2011-07-01 00:17:55 +04:00
|
|
|
GDI_COLOR textColor;
|
2014-09-18 02:30:09 +04:00
|
|
|
BYTE palette[256 * 4];
|
2011-10-13 23:51:07 +04:00
|
|
|
gdiBitmap* tile;
|
|
|
|
gdiBitmap* image;
|
2014-09-12 22:57:44 +04:00
|
|
|
|
|
|
|
BOOL inGfxFrame;
|
|
|
|
BOOL graphicsReset;
|
|
|
|
UINT16 outputSurfaceId;
|
|
|
|
REGION16 invalidRegion;
|
|
|
|
RdpgfxClientContext* gfx;
|
2011-07-01 00:17:55 +04:00
|
|
|
};
|
|
|
|
|
2013-04-29 21:09:23 +04:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2015-06-26 15:32:38 +03:00
|
|
|
FREERDP_API DWORD gdi_rop3_code(BYTE code);
|
2014-09-12 06:29:09 +04:00
|
|
|
FREERDP_API UINT32 gdi_get_pixel_format(UINT32 bitsPerPixel, BOOL vFlip);
|
2012-10-09 11:01:37 +04:00
|
|
|
FREERDP_API BYTE* gdi_get_bitmap_pointer(HGDI_DC hdcBmp, int x, int y);
|
|
|
|
FREERDP_API BYTE* gdi_get_brush_pointer(HGDI_DC hdcBrush, int x, int y);
|
2015-05-08 22:39:23 +03:00
|
|
|
FREERDP_API BOOL gdi_resize(rdpGdi* gdi, int width, int height);
|
2011-10-16 08:50:10 +04:00
|
|
|
|
2015-05-08 22:39:23 +03:00
|
|
|
FREERDP_API BOOL gdi_init(freerdp* instance, UINT32 flags, BYTE* buffer);
|
2011-08-17 07:54:42 +04:00
|
|
|
FREERDP_API void gdi_free(freerdp* instance);
|
2011-07-01 00:17:55 +04:00
|
|
|
|
2013-04-29 21:09:23 +04:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2014-09-12 16:36:29 +04:00
|
|
|
#define GDI_TAG FREERDP_TAG("gdi")
|
2011-07-01 00:17:55 +04:00
|
|
|
#ifdef WITH_DEBUG_GDI
|
2014-09-12 16:36:29 +04:00
|
|
|
#define DEBUG_GDI(fmt, ...) WLog_DBG(GDI_TAG, fmt, ## __VA_ARGS__)
|
2011-07-01 00:17:55 +04:00
|
|
|
#else
|
2014-09-12 16:36:29 +04:00
|
|
|
#define DEBUG_GDI(fmt, ...)
|
2011-07-01 00:17:55 +04:00
|
|
|
#endif
|
|
|
|
|
2012-12-14 09:25:48 +04:00
|
|
|
#endif /* FREERDP_GDI_H */
|