1 /*
2   Copyright 1999-2019 ImageMagick Studio LLC, a non-profit organization
3   dedicated to making software imaging solutions freely available.
4 
5   You may not use this file except in compliance with the License.  You may
6   obtain a copy of the License at
7 
8     https://imagemagick.org/script/license.php
9 
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License.
15 
16   MagickCore drawing methods.
17 */
18 #ifndef MAGICKCORE_DRAW_H
19 #define MAGICKCORE_DRAW_H
20 
21 #include "MagickCore/geometry.h"
22 #include "MagickCore/image.h"
23 #include "MagickCore/pixel.h"
24 #include "MagickCore/type.h"
25 #include "MagickCore/color.h"
26 
27 #if defined(__cplusplus) || defined(c_plusplus)
28 extern "C" {
29 #endif
30 
31 typedef enum
32 {
33   UndefinedAlign,
34   LeftAlign,
35   CenterAlign,
36   RightAlign
37 } AlignType;
38 
39 typedef enum
40 {
41   UndefinedPathUnits,
42   UserSpace,
43   UserSpaceOnUse,
44   ObjectBoundingBox
45 } ClipPathUnits;
46 
47 typedef enum
48 {
49   UndefinedDecoration,
50   NoDecoration,
51   UnderlineDecoration,
52   OverlineDecoration,
53   LineThroughDecoration
54 } DecorationType;
55 
56 typedef enum
57 {
58   UndefinedDirection,
59   RightToLeftDirection,
60   LeftToRightDirection
61 } DirectionType;
62 
63 typedef enum
64 {
65   UndefinedRule,
66 #undef EvenOddRule
67   EvenOddRule,
68   NonZeroRule
69 } FillRule;
70 
71 typedef enum
72 {
73   UndefinedGradient,
74   LinearGradient,
75   RadialGradient
76 } GradientType;
77 
78 typedef enum
79 {
80   UndefinedCap,
81   ButtCap,
82   RoundCap,
83   SquareCap
84 } LineCap;
85 
86 typedef enum
87 {
88   UndefinedJoin,
89   MiterJoin,
90   RoundJoin,
91   BevelJoin
92 } LineJoin;
93 
94 typedef enum
95 {
96   UndefinedMethod,
97   PointMethod,
98   ReplaceMethod,
99   FloodfillMethod,
100   FillToBorderMethod,
101   ResetMethod
102 } PaintMethod;
103 
104 typedef enum
105 {
106   UndefinedPrimitive,
107   AlphaPrimitive,
108   ArcPrimitive,
109   BezierPrimitive,
110   CirclePrimitive,
111   ColorPrimitive,
112   EllipsePrimitive,
113   ImagePrimitive,
114   LinePrimitive,
115   PathPrimitive,
116   PointPrimitive,
117   PolygonPrimitive,
118   PolylinePrimitive,
119   RectanglePrimitive,
120   RoundRectanglePrimitive,
121   TextPrimitive
122 } PrimitiveType;
123 
124 typedef enum
125 {
126   UndefinedReference,
127   GradientReference
128 } ReferenceType;
129 
130 typedef enum
131 {
132   UndefinedSpread,
133   PadSpread,
134   ReflectSpread,
135   RepeatSpread
136 } SpreadMethod;
137 
138 typedef struct _StopInfo
139 {
140   PixelInfo
141     color;
142 
143   double
144     offset;
145 } StopInfo;
146 
147 typedef struct _GradientInfo
148 {
149   GradientType
150     type;
151 
152   RectangleInfo
153     bounding_box;
154 
155   SegmentInfo
156     gradient_vector;
157 
158   StopInfo
159     *stops;
160 
161   size_t
162     number_stops;
163 
164   SpreadMethod
165     spread;
166 
167   MagickBooleanType
168     debug;
169 
170   PointInfo
171     center,
172     radii;
173 
174   double
175     radius,
176     angle;
177 
178   size_t
179     signature;
180 } GradientInfo;
181 
182 typedef struct _ElementReference
183 {
184   char
185     *id;
186 
187   ReferenceType
188     type;
189 
190   GradientInfo
191     gradient;
192 
193   struct _ElementReference
194     *previous,
195     *next;
196 
197   size_t
198     signature;
199 } ElementReference;
200 
201 typedef struct _DrawInfo
202 {
203   char
204     *primitive,
205     *geometry;
206 
207   RectangleInfo
208     viewbox;
209 
210   AffineMatrix
211     affine;
212 
213   PixelInfo
214     fill,
215     stroke,
216     undercolor,
217     border_color;
218 
219   Image
220     *fill_pattern,
221     *stroke_pattern;
222 
223   double
224     stroke_width;
225 
226   GradientInfo
227     gradient;
228 
229   MagickBooleanType
230     stroke_antialias,
231     text_antialias;
232 
233   FillRule
234     fill_rule;
235 
236   LineCap
237     linecap;
238 
239   LineJoin
240     linejoin;
241 
242   size_t
243     miterlimit;
244 
245   double
246     dash_offset;
247 
248   DecorationType
249     decorate;
250 
251   CompositeOperator
252     compose;
253 
254   char
255     *text,
256     *font,
257     *metrics,
258     *family;
259 
260   size_t
261     face;
262 
263   StyleType
264     style;
265 
266   StretchType
267     stretch;
268 
269   size_t
270     weight;
271 
272   char
273     *encoding;
274 
275   double
276     pointsize;
277 
278   char
279     *density;
280 
281   AlignType
282     align;
283 
284   GravityType
285     gravity;
286 
287   char
288     *server_name;
289 
290   double
291     *dash_pattern;
292 
293   char
294     *clip_mask;
295 
296   SegmentInfo
297     bounds;
298 
299   ClipPathUnits
300     clip_units;
301 
302   Quantum
303     alpha;
304 
305   MagickBooleanType
306     render;
307 
308   ElementReference
309     element_reference;
310 
311   double
312     kerning,
313     interword_spacing,
314     interline_spacing;
315 
316   DirectionType
317     direction;
318 
319   MagickBooleanType
320     debug;
321 
322   size_t
323     signature;
324 
325   double
326     fill_alpha,
327     stroke_alpha;
328 
329   MagickBooleanType
330     clip_path;
331 
332   Image
333     *clipping_mask;
334 
335   ComplianceType
336     compliance;
337 
338   Image
339     *composite_mask;
340 } DrawInfo;
341 
342 typedef struct _PrimitiveInfo
343 {
344   PointInfo
345     point;
346 
347   size_t
348     coordinates;
349 
350   PrimitiveType
351     primitive;
352 
353   PaintMethod
354     method;
355 
356   char
357     *text;
358 
359   MagickBooleanType
360     closed_subpath;
361 } PrimitiveInfo;
362 
363 typedef struct _TypeMetric
364 {
365   PointInfo
366     pixels_per_em;
367 
368   double
369     ascent,
370     descent,
371     width,
372     height,
373     max_advance,
374     underline_position,
375     underline_thickness;
376 
377   SegmentInfo
378     bounds;
379 
380   PointInfo
381     origin;
382 } TypeMetric;
383 
384 extern MagickExport DrawInfo
385   *AcquireDrawInfo(void),
386   *CloneDrawInfo(const ImageInfo *,const DrawInfo *),
387   *DestroyDrawInfo(DrawInfo *);
388 
389 extern MagickExport MagickBooleanType
390   DrawAffineImage(Image *,const Image *,const AffineMatrix *,ExceptionInfo *),
391   DrawClipPath(Image *,const DrawInfo *,const char *,ExceptionInfo *),
392   DrawGradientImage(Image *,const DrawInfo *,ExceptionInfo *),
393   DrawImage(Image *,const DrawInfo *,ExceptionInfo *),
394   DrawPatternPath(Image *,const DrawInfo *,const char *,Image **,
395     ExceptionInfo *),
396   DrawPrimitive(Image *,const DrawInfo *,const PrimitiveInfo *,ExceptionInfo *);
397 
398 extern MagickExport void
399   GetAffineMatrix(AffineMatrix *),
400   GetDrawInfo(const ImageInfo *,DrawInfo *);
401 
402 #if defined(__cplusplus) || defined(c_plusplus)
403 }
404 #endif
405 
406 #endif
407