Sync with trunk rev.61910 to get latest improvements and bugfixes.
[reactos.git] / dll / win32 / gdiplus / gdiplus_private.h
1 /*
2 * Copyright (C) 2007 Google (Evan Stade)
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19 #ifndef __WINE_GP_PRIVATE_H_
20 #define __WINE_GP_PRIVATE_H_
21
22 #include <math.h>
23 #include <stdarg.h>
24
25 #define WIN32_NO_STATUS
26 #define _INC_WINDOWS
27 #define COM_NO_WINDOWS_H
28
29 #define NONAMELESSUNION
30 #define COBJMACROS
31
32 #include <windef.h>
33 #include <winbase.h>
34 #include <wingdi.h>
35 #include <objbase.h>
36 #include <wincodecsdk.h>
37 #include <gdiplus.h>
38
39 #include <wine/unicode.h>
40 #include <wine/list.h>
41
42 #include <wine/debug.h>
43 WINE_DEFAULT_DEBUG_CHANNEL(gdiplus);
44
45 #define GP_DEFAULT_PENSTYLE (PS_GEOMETRIC | PS_SOLID | PS_ENDCAP_FLAT | PS_JOIN_MITER)
46 #define MAX_ARC_PTS (13)
47 #define MAX_DASHLEN (16) /* this is a limitation of gdi */
48 #define INCH_HIMETRIC (2540)
49
50 #define VERSION_MAGIC 0xdbc01001
51 #define TENSION_CONST (0.3)
52
53 COLORREF ARGB2COLORREF(ARGB color) DECLSPEC_HIDDEN;
54 HBITMAP ARGB2BMP(ARGB color) DECLSPEC_HIDDEN;
55 extern INT arc2polybezier(GpPointF * points, REAL x1, REAL y1, REAL x2, REAL y2,
56 REAL startAngle, REAL sweepAngle) DECLSPEC_HIDDEN;
57 extern REAL gdiplus_atan2(REAL dy, REAL dx) DECLSPEC_HIDDEN;
58 extern GpStatus hresult_to_status(HRESULT res) DECLSPEC_HIDDEN;
59 extern REAL units_to_pixels(REAL units, GpUnit unit, REAL dpi) DECLSPEC_HIDDEN;
60 extern REAL pixels_to_units(REAL pixels, GpUnit unit, REAL dpi) DECLSPEC_HIDDEN;
61 extern REAL units_scale(GpUnit from, GpUnit to, REAL dpi) DECLSPEC_HIDDEN;
62
63 extern GpStatus graphics_from_image(GpImage *image, GpGraphics **graphics) DECLSPEC_HIDDEN;
64
65 extern GpStatus METAFILE_GetGraphicsContext(GpMetafile* metafile, GpGraphics **result) DECLSPEC_HIDDEN;
66 extern GpStatus METAFILE_GetDC(GpMetafile* metafile, HDC *hdc) DECLSPEC_HIDDEN;
67 extern GpStatus METAFILE_ReleaseDC(GpMetafile* metafile, HDC hdc) DECLSPEC_HIDDEN;
68 extern GpStatus METAFILE_GraphicsDeleted(GpMetafile* metafile) DECLSPEC_HIDDEN;
69 extern MetafileType METAFILE_GetEmfType(HENHMETAFILE hemf) DECLSPEC_HIDDEN;
70
71 extern void calc_curve_bezier(CONST GpPointF *pts, REAL tension, REAL *x1,
72 REAL *y1, REAL *x2, REAL *y2) DECLSPEC_HIDDEN;
73 extern void calc_curve_bezier_endp(REAL xend, REAL yend, REAL xadj, REAL yadj,
74 REAL tension, REAL *x, REAL *y) DECLSPEC_HIDDEN;
75
76 extern void free_installed_fonts(void) DECLSPEC_HIDDEN;
77
78 extern BOOL lengthen_path(GpPath *path, INT len) DECLSPEC_HIDDEN;
79
80 extern GpStatus trace_path(GpGraphics *graphics, GpPath *path) DECLSPEC_HIDDEN;
81
82 typedef struct region_element region_element;
83 extern void delete_element(region_element *element) DECLSPEC_HIDDEN;
84
85 extern GpStatus get_hatch_data(HatchStyle hatchstyle, const char **result) DECLSPEC_HIDDEN;
86
87 static inline INT gdip_round(REAL x)
88 {
89 return (INT) floorf(x + 0.5);
90 }
91
92 static inline INT ceilr(REAL x)
93 {
94 return (INT) ceilf(x);
95 }
96
97 static inline REAL deg2rad(REAL degrees)
98 {
99 return M_PI * degrees / 180.0;
100 }
101
102 static inline ARGB color_over(ARGB bg, ARGB fg)
103 {
104 BYTE b, g, r, a;
105 BYTE bg_alpha, fg_alpha;
106
107 fg_alpha = (fg>>24)&0xff;
108
109 if (fg_alpha == 0xff) return fg;
110
111 if (fg_alpha == 0) return bg;
112
113 bg_alpha = (((bg>>24)&0xff) * (0xff-fg_alpha)) / 0xff;
114
115 if (bg_alpha == 0) return fg;
116
117 a = bg_alpha + fg_alpha;
118 b = ((bg&0xff)*bg_alpha + (fg&0xff)*fg_alpha)/a;
119 g = (((bg>>8)&0xff)*bg_alpha + ((fg>>8)&0xff)*fg_alpha)/a;
120 r = (((bg>>16)&0xff)*bg_alpha + ((fg>>16)&0xff)*fg_alpha)/a;
121
122 return (a<<24)|(r<<16)|(g<<8)|b;
123 }
124
125 extern const char *debugstr_rectf(CONST RectF* rc) DECLSPEC_HIDDEN;
126
127 extern const char *debugstr_pointf(CONST PointF* pt) DECLSPEC_HIDDEN;
128
129 extern void convert_32bppARGB_to_32bppPARGB(UINT width, UINT height,
130 BYTE *dst_bits, INT dst_stride, const BYTE *src_bits, INT src_stride) DECLSPEC_HIDDEN;
131
132 extern GpStatus convert_pixels(INT width, INT height,
133 INT dst_stride, BYTE *dst_bits, PixelFormat dst_format,
134 INT src_stride, const BYTE *src_bits, PixelFormat src_format, ColorPalette *palette) DECLSPEC_HIDDEN;
135
136 struct GpMatrix{
137 REAL matrix[6];
138 };
139
140 struct GpPen{
141 UINT style;
142 GpUnit unit;
143 REAL width;
144 GpLineCap endcap;
145 GpLineCap startcap;
146 GpDashCap dashcap;
147 GpCustomLineCap *customstart;
148 GpCustomLineCap *customend;
149 GpLineJoin join;
150 REAL miterlimit;
151 GpDashStyle dash;
152 REAL *dashes;
153 INT numdashes;
154 REAL offset; /* dash offset */
155 GpBrush *brush;
156 GpPenAlignment align;
157 };
158
159 struct GpGraphics{
160 HDC hdc;
161 HWND hwnd;
162 BOOL owndc;
163 BOOL alpha_hdc;
164 GpImage *image;
165 ImageType image_type;
166 SmoothingMode smoothing;
167 CompositingQuality compqual;
168 InterpolationMode interpolation;
169 PixelOffsetMode pixeloffset;
170 CompositingMode compmode;
171 TextRenderingHint texthint;
172 GpUnit unit; /* page unit */
173 REAL scale; /* page scale */
174 REAL xres, yres;
175 GpMatrix worldtrans; /* world transform */
176 BOOL busy; /* hdc handle obtained by GdipGetDC */
177 GpRegion *clip; /* in device coords */
178 UINT textcontrast; /* not used yet. get/set only */
179 struct list containers;
180 GraphicsContainer contid; /* last-issued container ID */
181 INT origin_x, origin_y;
182 /* For giving the caller an HDC when we technically can't: */
183 HBITMAP temp_hbitmap;
184 int temp_hbitmap_width;
185 int temp_hbitmap_height;
186 BYTE *temp_bits;
187 HDC temp_hdc;
188 };
189
190 struct GpBrush{
191 GpBrushType bt;
192 };
193
194 struct GpHatch{
195 GpBrush brush;
196 HatchStyle hatchstyle;
197 ARGB forecol;
198 ARGB backcol;
199 };
200
201 struct GpSolidFill{
202 GpBrush brush;
203 ARGB color;
204 };
205
206 struct GpPathGradient{
207 GpBrush brush;
208 GpPath* path;
209 ARGB centercolor;
210 GpWrapMode wrap;
211 BOOL gamma;
212 GpPointF center;
213 GpPointF focus;
214 REAL* blendfac; /* blend factors */
215 REAL* blendpos; /* blend positions */
216 INT blendcount;
217 ARGB *surroundcolors;
218 INT surroundcolorcount;
219 ARGB* pblendcolor; /* preset blend colors */
220 REAL* pblendpos; /* preset blend positions */
221 INT pblendcount;
222 GpMatrix transform;
223 };
224
225 struct GpLineGradient{
226 GpBrush brush;
227 GpPointF startpoint;
228 GpPointF endpoint;
229 ARGB startcolor;
230 ARGB endcolor;
231 RectF rect;
232 GpWrapMode wrap;
233 BOOL gamma;
234 REAL* blendfac; /* blend factors */
235 REAL* blendpos; /* blend positions */
236 INT blendcount;
237 ARGB* pblendcolor; /* preset blend colors */
238 REAL* pblendpos; /* preset blend positions */
239 INT pblendcount;
240 };
241
242 struct GpTexture{
243 GpBrush brush;
244 GpMatrix transform;
245 GpImage *image;
246 GpImageAttributes *imageattributes;
247 BYTE *bitmap_bits; /* image bits converted to ARGB and run through imageattributes */
248 };
249
250 struct GpPath{
251 GpFillMode fill;
252 GpPathData pathdata;
253 BOOL newfigure; /* whether the next drawing action starts a new figure */
254 INT datalen; /* size of the arrays in pathdata */
255 };
256
257 struct GpPathIterator{
258 GpPathData pathdata;
259 INT subpath_pos; /* for NextSubpath methods */
260 INT marker_pos; /* for NextMarker methods */
261 INT pathtype_pos; /* for NextPathType methods */
262 };
263
264 struct GpCustomLineCap{
265 GpPathData pathdata;
266 BOOL fill; /* TRUE for fill, FALSE for stroke */
267 GpLineCap cap; /* as far as I can tell, this value is ignored */
268 REAL inset; /* how much to adjust the end of the line */
269 GpLineJoin join;
270 REAL scale;
271 };
272
273 struct GpAdustableArrowCap{
274 GpCustomLineCap cap;
275 };
276
277 struct GpImage{
278 IPicture *picture;
279 IStream *stream; /* source stream */
280 ImageType type;
281 GUID format;
282 UINT flags;
283 UINT frame_count, current_frame;
284 ColorPalette *palette;
285 REAL xres, yres;
286 };
287
288 struct GpMetafile{
289 GpImage image;
290 GpRectF bounds;
291 GpUnit unit;
292 MetafileType metafile_type;
293 HENHMETAFILE hemf;
294 int preserve_hemf; /* if true, hemf belongs to the app and should not be deleted */
295
296 /* recording */
297 HDC record_dc;
298 GpGraphics *record_graphics;
299 BYTE *comment_data;
300 DWORD comment_data_size;
301 DWORD comment_data_length;
302
303 /* playback */
304 GpGraphics *playback_graphics;
305 HDC playback_dc;
306 GpPointF playback_points[3];
307 HANDLETABLE *handle_table;
308 int handle_count;
309 };
310
311 struct GpBitmap{
312 GpImage image;
313 INT width;
314 INT height;
315 PixelFormat format;
316 ImageLockMode lockmode;
317 INT numlocks;
318 BYTE *bitmapbits; /* pointer to the buffer we passed in BitmapLockBits */
319 HBITMAP hbitmap;
320 HDC hdc;
321 BYTE *bits; /* actual image bits if this is a DIB */
322 INT stride; /* stride of bits if this is a DIB */
323 BYTE *own_bits; /* image bits that need to be freed with this object */
324 INT lockx, locky; /* X and Y coordinates of the rect when a bitmap is locked for writing. */
325 IWICMetadataReader *metadata_reader; /* NULL if there is no metadata */
326 UINT prop_count;
327 PropertyItem *prop_item; /* cached image properties */
328 };
329
330 struct GpCachedBitmap{
331 GpImage *image;
332 };
333
334 struct color_key{
335 BOOL enabled;
336 ARGB low;
337 ARGB high;
338 };
339
340 struct color_matrix{
341 BOOL enabled;
342 ColorMatrixFlags flags;
343 ColorMatrix colormatrix;
344 ColorMatrix graymatrix;
345 };
346
347 struct color_remap_table{
348 BOOL enabled;
349 INT mapsize;
350 ColorMap *colormap;
351 };
352
353 struct GpImageAttributes{
354 WrapMode wrap;
355 ARGB outside_color;
356 BOOL clamp;
357 struct color_key colorkeys[ColorAdjustTypeCount];
358 struct color_matrix colormatrices[ColorAdjustTypeCount];
359 struct color_remap_table colorremaptables[ColorAdjustTypeCount];
360 BOOL gamma_enabled[ColorAdjustTypeCount];
361 REAL gamma[ColorAdjustTypeCount];
362 };
363
364 struct GpFont{
365 GpFontFamily *family;
366 OUTLINETEXTMETRICW otm;
367 REAL emSize; /* in font units */
368 Unit unit;
369 };
370
371 struct GpStringFormat{
372 INT attr;
373 LANGID lang;
374 LANGID digitlang;
375 StringAlignment align;
376 StringTrimming trimming;
377 HotkeyPrefix hkprefix;
378 StringAlignment vertalign;
379 StringDigitSubstitute digitsub;
380 INT tabcount;
381 REAL firsttab;
382 REAL *tabs;
383 CharacterRange *character_ranges;
384 INT range_count;
385 BOOL generic_typographic;
386 };
387
388 struct GpFontCollection{
389 GpFontFamily **FontFamilies;
390 INT count;
391 INT allocated;
392 };
393
394 struct GpFontFamily{
395 WCHAR FamilyName[LF_FACESIZE];
396 UINT16 em_height, ascent, descent, line_spacing; /* in font units */
397 int dpi;
398 };
399
400 /* internal use */
401 typedef enum RegionType
402 {
403 RegionDataRect = 0x10000000,
404 RegionDataPath = 0x10000001,
405 RegionDataEmptyRect = 0x10000002,
406 RegionDataInfiniteRect = 0x10000003,
407 } RegionType;
408
409 struct region_element
410 {
411 DWORD type; /* Rectangle, Path, SpecialRectangle, or CombineMode */
412 union
413 {
414 GpRectF rect;
415 struct
416 {
417 GpPath* path;
418 struct
419 {
420 DWORD size;
421 DWORD magic;
422 DWORD count;
423 DWORD flags;
424 } pathheader;
425 } pathdata;
426 struct
427 {
428 struct region_element *left; /* the original region */
429 struct region_element *right; /* what *left was combined with */
430 } combine;
431 } elementdata;
432 };
433
434 struct GpRegion{
435 struct
436 {
437 DWORD size;
438 DWORD checksum;
439 DWORD magic;
440 DWORD num_children;
441 } header;
442 region_element node;
443 };
444
445 typedef GpStatus (*gdip_format_string_callback)(HDC hdc,
446 GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font,
447 GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format,
448 INT lineno, const RectF *bounds, INT *underlined_indexes,
449 INT underlined_index_count, void *user_data);
450
451 GpStatus gdip_format_string(HDC hdc,
452 GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font,
453 GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, int ignore_empty_clip,
454 gdip_format_string_callback callback, void *user_data) DECLSPEC_HIDDEN;
455
456 void get_log_fontW(const GpFont *, GpGraphics *, LOGFONTW *) DECLSPEC_HIDDEN;
457
458 #endif /* __WINE_GP_PRIVATE_H_ */