1 /*
2   Copyright 1999-2021 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 image geometry methods.
17 */
18 #ifndef MAGICKCORE_GEOMETRY_H
19 #define MAGICKCORE_GEOMETRY_H
20 
21 #if defined(__cplusplus) || defined(c_plusplus)
22 extern "C" {
23 #endif
24 
25 typedef enum
26 {
27 #undef NoValue
28   NoValue = 0x0000,
29 #undef XValue
30   XValue = 0x0001,
31   XiValue = 0x0001,
32 #undef YValue
33   YValue = 0x0002,
34   PsiValue = 0x0002,
35 #undef WidthValue
36   WidthValue = 0x0004,
37   RhoValue = 0x0004,
38 #undef HeightValue
39   HeightValue = 0x0008,
40   SigmaValue = 0x0008,
41   ChiValue = 0x0010,
42   XiNegative = 0x0020,
43 #undef XNegative
44   XNegative = 0x0020,
45   PsiNegative = 0x0040,
46 #undef YNegative
47   YNegative = 0x0040,
48   ChiNegative = 0x0080,
49   PercentValue = 0x1000,    /* '%'  percentage of something */
50   AspectValue = 0x2000,     /* '!'  resize no-aspect - special use flag */
51   NormalizeValue = 0x2000,  /* '!'  ScaleKernelValue() in morphology.c */
52   LessValue = 0x4000,       /* '<'  resize smaller - special use flag */
53   GreaterValue = 0x8000,    /* '>'  resize larger - spacial use flag */
54   MinimumValue = 0x10000,   /* '^'  special handling needed */
55   CorrelateNormalizeValue = 0x10000, /* '^' see ScaleKernelValue() */
56   AreaValue = 0x20000,      /* '@'  resize to area - special use flag */
57   DecimalValue = 0x40000,   /* '.'  floating point numbers found */
58   SeparatorValue = 0x80000, /* 'x'  separator found */
59   AspectRatioValue = 0x100000,    /* '~'  special handling needed */
60   AlphaValue = 0x200000,    /* '/'  alpha */
61 #undef AllValues
62   AllValues = 0x7fffffff
63 } GeometryFlags;
64 
65 #if defined(ForgetGravity)
66 #undef ForgetGravity
67 #undef NorthWestGravity
68 #undef NorthGravity
69 #undef NorthEastGravity
70 #undef WestGravity
71 #undef CenterGravity
72 #undef EastGravity
73 #undef SouthWestGravity
74 #undef SouthGravity
75 #undef SouthEastGravity
76 #endif
77 
78 typedef enum
79 {
80   UndefinedGravity,
81   ForgetGravity = 0,
82   NorthWestGravity = 1,
83   NorthGravity = 2,
84   NorthEastGravity = 3,
85   WestGravity = 4,
86   CenterGravity = 5,
87   EastGravity = 6,
88   SouthWestGravity = 7,
89   SouthGravity = 8,
90   SouthEastGravity = 9
91 } GravityType;
92 
93 typedef struct _AffineMatrix
94 {
95   double
96     sx,
97     rx,
98     ry,
99     sy,
100     tx,
101     ty;
102 } AffineMatrix;
103 
104 typedef struct _GeometryInfo
105 {
106   double
107     rho,
108     sigma,
109     xi,
110     psi,
111     chi;
112 } GeometryInfo;
113 
114 typedef struct _OffsetInfo
115 {
116   ssize_t
117     x,
118     y;
119 } OffsetInfo;
120 
121 typedef struct _PointInfo
122 {
123   double
124     x,
125     y;
126 } PointInfo;
127 
128 typedef struct _RectangleInfo
129 {
130   size_t
131     width,
132     height;
133 
134   ssize_t
135     x,
136     y;
137 } RectangleInfo;
138 
139 extern MagickExport char
140   *GetPageGeometry(const char *);
141 
142 extern MagickExport MagickBooleanType
143   IsGeometry(const char *),
144   IsSceneGeometry(const char *,const MagickBooleanType);
145 
146 extern MagickExport MagickStatusType
147   GetGeometry(const char *,ssize_t *,ssize_t *,size_t *,size_t *),
148   ParseAbsoluteGeometry(const char *,RectangleInfo *),
149   ParseAffineGeometry(const char *,AffineMatrix *,ExceptionInfo *),
150   ParseGeometry(const char *,GeometryInfo *),
151   ParseGravityGeometry(const Image *,const char *,RectangleInfo *,
152     ExceptionInfo *),
153   ParseMetaGeometry(const char *,ssize_t *,ssize_t *,size_t *,size_t *),
154   ParsePageGeometry(const Image *,const char *,RectangleInfo *,ExceptionInfo *),
155   ParseRegionGeometry(const Image *,const char *,RectangleInfo *,
156     ExceptionInfo *);
157 
158 extern MagickExport void
159   GravityAdjustGeometry(const size_t,const size_t,const GravityType,
160     RectangleInfo *),
161   SetGeometry(const Image *,RectangleInfo *),
162   SetGeometryInfo(GeometryInfo *);
163 
164 #if defined(__cplusplus) || defined(c_plusplus)
165 }
166 #endif
167 
168 #endif
169