gdiplus: Always treat out of range string sizes as INT_MAX.
[wine] / dlls / 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 #include "windef.h"
26 #include "wingdi.h"
27 #include "winbase.h"
28 #include "winuser.h"
29
30 #include "objbase.h"
31 #include "ocidl.h"
32 #include "wine/list.h"
33
34 #include "gdiplus.h"
35
36 #define GP_DEFAULT_PENSTYLE (PS_GEOMETRIC | PS_SOLID | PS_ENDCAP_FLAT | PS_JOIN_MITER)
37 #define MAX_ARC_PTS (13)
38 #define MAX_DASHLEN (16) /* this is a limitation of gdi */
39 #define INCH_HIMETRIC (2540)
40
41 #define VERSION_MAGIC 0xdbc01001
42 #define TENSION_CONST (0.3)
43
44 COLORREF ARGB2COLORREF(ARGB color);
45 HBITMAP ARGB2BMP(ARGB color);
46 extern INT arc2polybezier(GpPointF * points, REAL x1, REAL y1, REAL x2, REAL y2,
47     REAL startAngle, REAL sweepAngle);
48 extern REAL gdiplus_atan2(REAL dy, REAL dx);
49 extern GpStatus hresult_to_status(HRESULT res);
50 extern REAL convert_unit(HDC hdc, GpUnit unit);
51
52 extern void calc_curve_bezier(CONST GpPointF *pts, REAL tension, REAL *x1,
53     REAL *y1, REAL *x2, REAL *y2);
54 extern void calc_curve_bezier_endp(REAL xend, REAL yend, REAL xadj, REAL yadj,
55     REAL tension, REAL *x, REAL *y);
56
57 extern void free_installed_fonts(void);
58
59 extern BOOL lengthen_path(GpPath *path, INT len);
60
61 extern GpStatus trace_path(GpGraphics *graphics, GpPath *path);
62
63 typedef struct region_element region_element;
64 extern void delete_element(region_element *element);
65
66 static inline INT roundr(REAL x)
67 {
68     return (INT) floorf(x + 0.5);
69 }
70
71 static inline INT ceilr(REAL x)
72 {
73     return (INT) ceilf(x);
74 }
75
76 static inline REAL deg2rad(REAL degrees)
77 {
78     return M_PI * degrees / 180.0;
79 }
80
81 static inline ARGB color_over(ARGB bg, ARGB fg)
82 {
83     BYTE b, g, r, a;
84     BYTE bg_alpha, fg_alpha;
85
86     fg_alpha = (fg>>24)&0xff;
87
88     if (fg_alpha == 0xff) return fg;
89
90     if (fg_alpha == 0) return bg;
91
92     bg_alpha = (((bg>>24)&0xff) * (0xff-fg_alpha)) / 0xff;
93
94     if (bg_alpha == 0) return fg;
95
96     a = bg_alpha + fg_alpha;
97     b = ((bg&0xff)*bg_alpha + (fg&0xff)*fg_alpha)/a;
98     g = (((bg>>8)&0xff)*bg_alpha + ((fg>>8)&0xff)*fg_alpha)/a;
99     r = (((bg>>16)&0xff)*bg_alpha + ((fg>>16)&0xff)*fg_alpha)/a;
100
101     return (a<<24)|(r<<16)|(g<<8)|b;
102 }
103
104 extern const char *debugstr_rectf(CONST RectF* rc);
105
106 extern const char *debugstr_pointf(CONST PointF* pt);
107
108 extern void convert_32bppARGB_to_32bppPARGB(UINT width, UINT height,
109     BYTE *dst_bits, INT dst_stride, const BYTE *src_bits, INT src_stride);
110
111 extern GpStatus convert_pixels(UINT width, UINT height,
112     INT dst_stride, BYTE *dst_bits, PixelFormat dst_format,
113     INT src_stride, const BYTE *src_bits, PixelFormat src_format, ARGB *src_palette);
114
115 struct GpPen{
116     UINT style;
117     GpUnit unit;
118     REAL width;
119     GpLineCap endcap;
120     GpLineCap startcap;
121     GpDashCap dashcap;
122     GpCustomLineCap *customstart;
123     GpCustomLineCap *customend;
124     GpLineJoin join;
125     REAL miterlimit;
126     GpDashStyle dash;
127     REAL *dashes;
128     INT numdashes;
129     REAL offset;    /* dash offset */
130     GpBrush *brush;
131     GpPenAlignment align;
132 };
133
134 struct GpGraphics{
135     HDC hdc;
136     HWND hwnd;
137     BOOL owndc;
138     GpImage *image;
139     SmoothingMode smoothing;
140     CompositingQuality compqual;
141     InterpolationMode interpolation;
142     PixelOffsetMode pixeloffset;
143     CompositingMode compmode;
144     TextRenderingHint texthint;
145     GpUnit unit;    /* page unit */
146     REAL scale;     /* page scale */
147     GpMatrix * worldtrans; /* world transform */
148     BOOL busy;      /* hdc handle obtained by GdipGetDC */
149     GpRegion *clip;
150     UINT textcontrast; /* not used yet. get/set only */
151     struct list containers;
152     GraphicsContainer contid; /* last-issued container ID */
153 };
154
155 struct GpBrush{
156     HBRUSH gdibrush;
157     GpBrushType bt;
158     LOGBRUSH lb;
159 };
160
161 struct GpHatch{
162     GpBrush brush;
163     HatchStyle hatchstyle;
164     ARGB forecol;
165     ARGB backcol;
166 };
167
168 struct GpSolidFill{
169     GpBrush brush;
170     ARGB color;
171     HBITMAP bmp;
172 };
173
174 struct GpPathGradient{
175     GpBrush brush;
176     PathData pathdata;
177     ARGB centercolor;
178     GpWrapMode wrap;
179     BOOL gamma;
180     GpPointF center;
181     GpPointF focus;
182     REAL* blendfac;  /* blend factors */
183     REAL* blendpos;  /* blend positions */
184     INT blendcount;
185 };
186
187 struct GpLineGradient{
188     GpBrush brush;
189     GpPointF startpoint;
190     GpPointF endpoint;
191     ARGB startcolor;
192     ARGB endcolor;
193     RectF rect;
194     GpWrapMode wrap;
195     BOOL gamma;
196     REAL* blendfac;  /* blend factors */
197     REAL* blendpos;  /* blend positions */
198     INT blendcount;
199     ARGB* pblendcolor; /* preset blend colors */
200     REAL* pblendpos; /* preset blend positions */
201     INT pblendcount;
202 };
203
204 struct GpTexture{
205     GpBrush brush;
206     GpMatrix *transform;
207     GpImage *image;
208     WrapMode wrap;  /* not used yet */
209 };
210
211 struct GpPath{
212     GpFillMode fill;
213     GpPathData pathdata;
214     BOOL newfigure; /* whether the next drawing action starts a new figure */
215     INT datalen; /* size of the arrays in pathdata */
216 };
217
218 struct GpMatrix{
219     REAL matrix[6];
220 };
221
222 struct GpPathIterator{
223     GpPathData pathdata;
224     INT subpath_pos;    /* for NextSubpath methods */
225     INT marker_pos;     /* for NextMarker methods */
226     INT pathtype_pos;   /* for NextPathType methods */
227 };
228
229 struct GpCustomLineCap{
230     GpPathData pathdata;
231     BOOL fill;      /* TRUE for fill, FALSE for stroke */
232     GpLineCap cap;  /* as far as I can tell, this value is ignored */
233     REAL inset;     /* how much to adjust the end of the line */
234     GpLineJoin join;
235     REAL scale;
236 };
237
238 struct GpAdustableArrowCap{
239     GpCustomLineCap cap;
240 };
241
242 struct GpImage{
243     IPicture* picture;
244     ImageType type;
245     GUID format;
246     UINT flags;
247     UINT palette_flags;
248     UINT palette_count;
249     UINT palette_size;
250     ARGB *palette_entries;
251     REAL xres, yres;
252 };
253
254 struct GpMetafile{
255     GpImage image;
256     GpRectF bounds;
257     GpUnit unit;
258 };
259
260 struct GpBitmap{
261     GpImage image;
262     INT width;
263     INT height;
264     PixelFormat format;
265     ImageLockMode lockmode;
266     INT numlocks;
267     BYTE *bitmapbits;   /* pointer to the buffer we passed in BitmapLockBits */
268     HBITMAP hbitmap;
269     HDC hdc;
270     BYTE *bits; /* actual image bits if this is a DIB */
271     INT stride; /* stride of bits if this is a DIB */
272 };
273
274 struct GpCachedBitmap{
275     GpImage *image;
276 };
277
278 struct color_key{
279     BOOL enabled;
280     ARGB low;
281     ARGB high;
282 };
283
284 struct color_matrix{
285     BOOL enabled;
286     ColorMatrixFlags flags;
287     ColorMatrix colormatrix;
288     ColorMatrix graymatrix;
289 };
290
291 struct color_remap_table{
292     BOOL enabled;
293     INT mapsize;
294     GDIPCONST ColorMap *colormap;
295 };
296
297 struct GpImageAttributes{
298     WrapMode wrap;
299     ARGB outside_color;
300     BOOL clamp;
301     struct color_key colorkeys[ColorAdjustTypeCount];
302     struct color_matrix colormatrices[ColorAdjustTypeCount];
303     struct color_remap_table colorremaptables[ColorAdjustTypeCount];
304     BOOL gamma_enabled[ColorAdjustTypeCount];
305     REAL gamma[ColorAdjustTypeCount];
306 };
307
308 struct GpFont{
309     LOGFONTW lfw;
310     REAL emSize;
311     UINT height;
312     LONG line_spacing;
313     Unit unit;
314 };
315
316 struct GpStringFormat{
317     INT attr;
318     LANGID lang;
319     LANGID digitlang;
320     StringAlignment align;
321     StringTrimming trimming;
322     HotkeyPrefix hkprefix;
323     StringAlignment vertalign;
324     StringDigitSubstitute digitsub;
325     INT tabcount;
326     REAL firsttab;
327     REAL *tabs;
328     CharacterRange *character_ranges;
329     INT range_count;
330 };
331
332 struct GpFontCollection{
333     GpFontFamily **FontFamilies;
334     INT count;
335     INT allocated;
336 };
337
338 struct GpFontFamily{
339     NEWTEXTMETRICW tmw;
340     WCHAR FamilyName[LF_FACESIZE];
341 };
342
343 /* internal use */
344 typedef enum RegionType
345 {
346     RegionDataRect          = 0x10000000,
347     RegionDataPath          = 0x10000001,
348     RegionDataEmptyRect     = 0x10000002,
349     RegionDataInfiniteRect  = 0x10000003,
350 } RegionType;
351
352 struct region_element
353 {
354     DWORD type; /* Rectangle, Path, SpecialRectangle, or CombineMode */
355     union
356     {
357         GpRectF rect;
358         struct
359         {
360             GpPath* path;
361             struct
362             {
363                 DWORD size;
364                 DWORD magic;
365                 DWORD count;
366                 DWORD flags;
367             } pathheader;
368         } pathdata;
369         struct
370         {
371             struct region_element *left;  /* the original region */
372             struct region_element *right; /* what *left was combined with */
373         } combine;
374     } elementdata;
375 };
376
377 struct GpRegion{
378     struct
379     {
380         DWORD size;
381         DWORD checksum;
382         DWORD magic;
383         DWORD num_children;
384     } header;
385     region_element node;
386 };
387
388 #endif