1 module dmagick.c.quantum;
2
3 import dmagick.c.cacheView;
4 import dmagick.c.exception;
5 import dmagick.c.image;
6 import dmagick.c.magickType;
7 import dmagick.c.magickVersion;
8
9 extern(C)
10 {
11 /**
12 * The endianess of the image when reading the image file.
13 */
14 enum EndianType
15 {
16 UndefinedEndian, /// Not defined (default).
17 LSBEndian, /// Little Endian.
18 MSBEndian /// Big Endian.
19 }
20
21 enum QuantumAlphaType
22 {
23 UndefinedQuantumAlpha,
24 AssociatedQuantumAlpha,
25 DisassociatedQuantumAlpha
26 }
27
28 enum QuantumFormatType
29 {
30 UndefinedQuantumFormat,
31 FloatingPointQuantumFormat,
32 SignedQuantumFormat,
33 UnsignedQuantumFormat
34 }
35
36 enum QuantumType
37 {
38 UndefinedQuantum,
39 AlphaQuantum,
40 BlackQuantum,
41 BlueQuantum,
42 CMYKAQuantum,
43 CMYKQuantum,
44 CyanQuantum,
45 GrayAlphaQuantum,
46 GrayQuantum,
47 GreenQuantum,
48 IndexAlphaQuantum,
49 IndexQuantum,
50 MagentaQuantum,
51 OpacityQuantum,
52 RedQuantum,
53 RGBAQuantum,
54 BGRAQuantum,
55 RGBOQuantum,
56 RGBQuantum,
57 YellowQuantum,
58 GrayPadQuantum,
59 RGBPadQuantum,
60 CbYCrYQuantum,
61 CbYCrQuantum,
62 CbYCrAQuantum,
63 CMYKOQuantum,
64 BGRQuantum,
65 BGROQuantum
66 }
67
68 struct QuantumInfo {}
69
70 alias ClampToQuantum RoundToQuantum;
71 static pure nothrow Quantum ClampToQuantum(const MagickRealType value)
72 {
73 static if(MagickHDRISupport)
74 {
75 return value;
76 }
77 else
78 {
79 if (value <= 0.0)
80 return(cast(Quantum) 0);
81 if (value >= cast(MagickRealType) QuantumRange)
82 return(cast(Quantum) QuantumRange);
83 return(cast(Quantum) (value+0.5));
84 }
85 }
86
87 static pure nothrow ubyte ScaleQuantumToChar(const Quantum quantum)
88 {
89 static if(MagickHDRISupport)
90 {
91 if ( quantum <= 0 )
92 return 0;
93 static if ( MagickQuantumDepth == 8 )
94 {
95 if ( quantum >= 255 )
96 return 255;
97 return cast(ubyte)(quantum+0.5);
98 }
99 else static if ( MagickQuantumDepth == 16 )
100 {
101 if ( quantum/257 >= 255)
102 return 255;
103 return cast(ubyte)(quantum/257+0.5);
104 }
105 else static if ( MagickQuantumDepth == 32 )
106 {
107 if ( quantum/16843009 >= 255)
108 return 255;
109 return cast(ubyte)(quantum/16843009+0.5);
110 }
111 else
112 {
113 if ( quantum/72340172838076673 >= 255)
114 return 255;
115 return cast(ubyte)(quantum/72340172838076673+0.5);
116 }
117 }
118 else
119 {
120 static if ( MagickQuantumDepth == 8 )
121 return quantum;
122 else static if ( MagickQuantumDepth == 16 )
123 return cast(ubyte) (((quantum+128UL)-((quantum+128UL) >> 8)) >> 8);
124 else static if ( MagickQuantumDepth == 32 )
125 return cast(ubyte) (quantum+8421504UL/16843009UL );
126 else
127 return cast(ubyte) (quantum/72340172838076673.0+0.5);
128 }
129 }
130
131 static pure nothrow Quantum ScaleCharToQuantum(ubyte value)
132 {
133 enum Quantum factor = QuantumRange/255;
134
135 return cast(Quantum)(factor*value);
136 }
137
138 static if ( MagickLibVersion >= 0x681 )
139 {
140 EndianType GetQuantumEndian(const(QuantumInfo)*);
141 }
142
143 MagickBooleanType SetQuantumDepth(const(Image)*, QuantumInfo*, const size_t);
144
145 static if ( MagickLibVersion >= 0x681 )
146 {
147 MagickBooleanType SetQuantumEndian(const(Image)*, QuantumInfo*, const EndianType);
148 }
149
150 MagickBooleanType SetQuantumFormat(const(Image)*, QuantumInfo*, const QuantumFormatType);
151 MagickBooleanType SetQuantumPad(const(Image)*, QuantumInfo*, const size_t);
152
153 static if ( MagickLibVersion >= 0x674 )
154 {
155 QuantumFormatType GetQuantumFormat(const(QuantumInfo)*);
156 }
157
158 QuantumInfo* AcquireQuantumInfo(const(ImageInfo)*, Image*);
159 QuantumInfo* DestroyQuantumInfo(QuantumInfo*);
160
161 QuantumType GetQuantumType(Image*, ExceptionInfo*);
162
163 size_t ExportQuantumPixels(const(Image)*, const(CacheView)*, const(QuantumInfo)*, const QuantumType, ubyte*, ExceptionInfo*);
164 size_t GetQuantumExtent(const(Image)*, const(QuantumInfo)*, const QuantumType);
165 size_t ImportQuantumPixels(Image*, CacheView*, const(QuantumInfo)*, const QuantumType, const(ubyte)*, ExceptionInfo*);
166
167 ubyte* GetQuantumPixels(const(QuantumInfo)*);
168
169 void GetQuantumInfo(const(ImageInfo)*, QuantumInfo*);
170 void SetQuantumAlphaType(QuantumInfo*, const QuantumAlphaType);
171 void SetQuantumImageType(Image*, const QuantumType);
172 void SetQuantumMinIsWhite(QuantumInfo*, const MagickBooleanType);
173 void SetQuantumPack(QuantumInfo*, const MagickBooleanType);
174 void SetQuantumQuantum(QuantumInfo*, const size_t);
175 void SetQuantumScale(QuantumInfo*, const double);
176 }