/** * FreeRDP: A Remote Desktop Protocol Client * GDI Library * * Copyright 2010-2011 Marc-Andre Moreau * * 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. */ #ifndef __GDI_H #define __GDI_H #include #include #include #include #include /* 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) */ #define GDI_SPna 0x000C0324 /* D = S & ~P */ #define GDI_DSna 0x00220326 /* D = D & ~S */ #define GDI_PDxn 0x00A50065 /* D = D ^ ~P */ /* 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 /* GDI Object Types */ #define GDIOBJECT_BITMAP 0x00 #define GDIOBJECT_PEN 0x01 #define GDIOBJECT_PALETTE 0x02 #define GDIOBJECT_BRUSH 0x03 #define GDIOBJECT_RECT 0x04 #define GDIOBJECT_REGION 0x04 struct _GDIOBJECT { uint8 objectType; }; typedef struct _GDIOBJECT GDIOBJECT; typedef GDIOBJECT* HGDIOBJECT; /* RGB encoded as 0x00BBGGRR */ typedef unsigned int GDI_COLOR; typedef GDI_COLOR* LPGDI_COLOR; struct _GDI_RECT { uint8 objectType; int left; int top; int right; int bottom; }; typedef struct _GDI_RECT GDI_RECT; typedef GDI_RECT* HGDI_RECT; struct _GDI_RGN { uint8 objectType; 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 { uint8 objectType; int bytesPerPixel; int bitsPerPixel; int width; int height; int scanline; uint8* data; }; typedef struct _GDI_BITMAP GDI_BITMAP; typedef GDI_BITMAP* HGDI_BITMAP; struct _GDI_PEN { uint8 objectType; 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 { uint8 red; uint8 green; uint8 blue; }; typedef struct _GDI_PALETTEENTRY GDI_PALETTEENTRY; struct _GDI_PALETTE { uint16 count; 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 { uint8 objectType; int style; HGDI_BITMAP pattern; GDI_COLOR color; }; typedef struct _GDI_BRUSH GDI_BRUSH; typedef GDI_BRUSH* HGDI_BRUSH; struct _GDI_WND { int count; int ninvalid; HGDI_RGN invalid; HGDI_RGN cinvalid; }; 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; struct gdi_bitmap { rdpBitmap _p; HGDI_DC hdc; HGDI_BITMAP bitmap; HGDI_BITMAP org_bitmap; }; typedef struct gdi_bitmap gdiBitmap; struct gdi_glyph { rdpBitmap _p; HGDI_DC hdc; HGDI_BITMAP bitmap; HGDI_BITMAP org_bitmap; }; typedef struct gdi_glyph gdiGlyph; struct rdp_gdi { rdpContext* context; int width; int height; int dstBpp; int srcBpp; int cursor_x; int cursor_y; int bytesPerPixel; HGDI_DC hdc; HCLRCONV clrconv; gdiBitmap* primary; gdiBitmap* drawing; uint8* primary_buffer; GDI_COLOR textColor; void* rfx_context; void* nsc_context; gdiBitmap* tile; gdiBitmap* image; }; FREERDP_API uint32 gdi_rop3_code(uint8 code); FREERDP_API uint8* gdi_get_bitmap_pointer(HGDI_DC hdcBmp, int x, int y); FREERDP_API uint8* gdi_get_brush_pointer(HGDI_DC hdcBrush, int x, int y); FREERDP_API int gdi_is_mono_pixel_set(uint8* data, int x, int y, int width); FREERDP_API void gdi_resize(rdpGdi* gdi, int width, int height); FREERDP_API int gdi_init(freerdp* instance, uint32 flags, uint8* buffer); FREERDP_API void gdi_free(freerdp* instance); #ifdef WITH_DEBUG_GDI #define DEBUG_GDI(fmt, ...) DEBUG_CLASS(GDI, fmt, ## __VA_ARGS__) #else #define DEBUG_GDI(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__) #endif #endif /* __GDI_H */