Home | History | Annotate | Download | only in MagickCore
      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