MagickCore  7.0.8
Convert, Edit, Or Compose Bitmap Images
deprecate.c
Go to the documentation of this file.
1 /*
2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 % %
4 % %
5 % %
6 % DDDD EEEEE PPPP RRRR EEEEE CCCC AAA TTTTT EEEEE %
7 % D D E P P R R E C A A T E %
8 % D D EEE PPPPP RRRR EEE C AAAAA T EEE %
9 % D D E P R R E C A A T E %
10 % DDDD EEEEE P R R EEEEE CCCC A A T EEEEE %
11 % %
12 % %
13 % MagickCore Deprecated Methods %
14 % %
15 % Software Design %
16 % Cristy %
17 % October 2002 %
18 % %
19 % %
20 % Copyright 1999-2018 ImageMagick Studio LLC, a non-profit organization %
21 % dedicated to making software imaging solutions freely available. %
22 % %
23 % You may not use this file except in compliance with the License. You may %
24 % obtain a copy of the License at %
25 % %
26 % https://imagemagick.org/script/license.php %
27 % %
28 % Unless required by applicable law or agreed to in writing, software %
29 % distributed under the License is distributed on an "AS IS" BASIS, %
30 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31 % See the License for the specific language governing permissions and %
32 % limitations under the License. %
33 % %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35 %
36 %
37 %
38 */
39 
40 /*
41  Include declarations.
42 */
43 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
44 #define WIN32_LEAN_AND_MEAN
45 #define VC_EXTRALEAN
46 #include <windows.h>
47 #endif
48 #include "MagickCore/studio.h"
49 #include "MagickCore/property.h"
50 #include "MagickCore/blob.h"
52 #include "MagickCore/cache.h"
53 #include "MagickCore/cache-view.h"
54 #include "MagickCore/client.h"
55 #include "MagickCore/color.h"
57 #include "MagickCore/colormap.h"
59 #include "MagickCore/colorspace.h"
61 #include "MagickCore/composite.h"
63 #include "MagickCore/constitute.h"
64 #include "MagickCore/draw.h"
66 #include "MagickCore/effect.h"
67 #include "MagickCore/enhance.h"
68 #include "MagickCore/exception.h"
70 #include "MagickCore/fx.h"
71 #include "MagickCore/geometry.h"
72 #include "MagickCore/identify.h"
73 #include "MagickCore/image.h"
75 #include "MagickCore/list.h"
76 #include "MagickCore/log.h"
77 #include "MagickCore/memory_.h"
78 #include "MagickCore/magick.h"
79 #include "MagickCore/monitor.h"
81 #include "MagickCore/morphology.h"
82 #include "MagickCore/paint.h"
83 #include "MagickCore/pixel.h"
85 #include "MagickCore/quantize.h"
86 #include "MagickCore/random_.h"
87 #include "MagickCore/resource_.h"
88 #include "MagickCore/semaphore.h"
89 #include "MagickCore/segment.h"
90 #include "MagickCore/splay-tree.h"
91 #include "MagickCore/statistic.h"
92 #include "MagickCore/string_.h"
93 #include "MagickCore/threshold.h"
94 #include "MagickCore/transform.h"
95 #include "MagickCore/utility.h"
96 
97 #if !defined(MAGICKCORE_EXCLUDE_DEPRECATED)
98 
99 /*
100 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
101 % %
102 % %
103 % %
104 + G e t M a g i c k S e e k a b l e S t r e a m %
105 % %
106 % %
107 % %
108 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
109 %
110 % GetMagickSeekableStream() returns MagickTrue if the magick supports a
111 % seekable stream.
112 %
113 % The format of the GetMagickSeekableStream method is:
114 %
115 % MagickBooleanType GetMagickSeekableStream(const MagickInfo *magick_info)
116 %
117 % A description of each parameter follows:
118 %
119 % o magick_info: The magick info.
120 %
121 */
123  const MagickInfo *magick_info)
124 {
125  assert(magick_info != (MagickInfo *) NULL);
126  assert(magick_info->signature == MagickCoreSignature);
127  return(((magick_info->flags & CoderSeekableStreamFlag) == 0) ? MagickFalse :
128  MagickTrue);
129 }
130 
131 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
132 /*
133 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
134 % %
135 % %
136 % %
137 % C r o p I m a g e T o H B i t m a p %
138 % %
139 % %
140 % %
141 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
142 %
143 % CropImageToHBITMAP() extracts a specified region of the image and returns
144 % it as a Windows HBITMAP. While the same functionality can be accomplished by
145 % invoking CropImage() followed by ImageToHBITMAP(), this method is more
146 % efficient since it copies pixels directly to the HBITMAP.
147 %
148 % The format of the CropImageToHBITMAP method is:
149 %
150 % HBITMAP CropImageToHBITMAP(Image* image,const RectangleInfo *geometry,
151 % ExceptionInfo *exception)
152 %
153 % A description of each parameter follows:
154 %
155 % o image: the image.
156 %
157 % o geometry: Define the region of the image to crop with members
158 % x, y, width, and height.
159 %
160 % o exception: return any errors or warnings in this structure.
161 %
162 */
164  const RectangleInfo *geometry,ExceptionInfo *exception)
165 {
166 #define CropImageTag "Crop/Image"
167 
168  BITMAP
169  bitmap;
170 
171  HBITMAP
172  bitmapH;
173 
174  HANDLE
175  bitmap_bitsH;
176 
178  proceed;
179 
181  page;
182 
183  register const Quantum
184  *p;
185 
186  register RGBQUAD
187  *q;
188 
189  RGBQUAD
190  *bitmap_bits;
191 
192  ssize_t
193  y;
194 
195  /*
196  Check crop geometry.
197  */
198  assert(image != (const Image *) NULL);
199  assert(image->signature == MagickCoreSignature);
200  if (image->debug != MagickFalse)
201  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
202  assert(geometry != (const RectangleInfo *) NULL);
203  assert(exception != (ExceptionInfo *) NULL);
204  assert(exception->signature == MagickCoreSignature);
205  if (((geometry->x+(ssize_t) geometry->width) < 0) ||
206  ((geometry->y+(ssize_t) geometry->height) < 0) ||
207  (geometry->x >= (ssize_t) image->columns) ||
208  (geometry->y >= (ssize_t) image->rows))
209  ThrowImageException(OptionError,"GeometryDoesNotContainImage");
210  page=(*geometry);
211  if ((page.x+(ssize_t) page.width) > (ssize_t) image->columns)
212  page.width=image->columns-page.x;
213  if ((page.y+(ssize_t) page.height) > (ssize_t) image->rows)
214  page.height=image->rows-page.y;
215  if (page.x < 0)
216  {
217  page.width+=page.x;
218  page.x=0;
219  }
220  if (page.y < 0)
221  {
222  page.height+=page.y;
223  page.y=0;
224  }
225 
226  if ((page.width == 0) || (page.height == 0))
227  ThrowImageException(OptionError,"GeometryDimensionsAreZero");
228  /*
229  Initialize crop image attributes.
230  */
231  bitmap.bmType = 0;
232  bitmap.bmWidth = (LONG) page.width;
233  bitmap.bmHeight = (LONG) page.height;
234  bitmap.bmWidthBytes = bitmap.bmWidth * 4;
235  bitmap.bmPlanes = 1;
236  bitmap.bmBitsPixel = 32;
237  bitmap.bmBits = NULL;
238 
239  bitmap_bitsH=(HANDLE) GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,page.width*
240  page.height*bitmap.bmBitsPixel);
241  if (bitmap_bitsH == NULL)
242  return(NULL);
243  bitmap_bits=(RGBQUAD *) GlobalLock((HGLOBAL) bitmap_bitsH);
244  if ( bitmap.bmBits == NULL )
245  bitmap.bmBits = bitmap_bits;
247  SetImageColorspace(image,sRGBColorspace,exception);
248  /*
249  Extract crop image.
250  */
251  q=bitmap_bits;
252  for (y=0; y < (ssize_t) page.height; y++)
253  {
254  register ssize_t
255  x;
256 
257  p=GetVirtualPixels(image,page.x,page.y+y,page.width,1,exception);
258  if (p == (const Quantum *) NULL)
259  break;
260 
261  /* Transfer pixels, scaling to Quantum */
262  for( x=(ssize_t) page.width ; x> 0 ; x-- )
263  {
264  q->rgbRed = ScaleQuantumToChar(GetPixelRed(image,p));
265  q->rgbGreen = ScaleQuantumToChar(GetPixelGreen(image,p));
266  q->rgbBlue = ScaleQuantumToChar(GetPixelBlue(image,p));
267  q->rgbReserved = 0;
268  p+=GetPixelChannels(image);
269  q++;
270  }
271  proceed=SetImageProgress(image,CropImageTag,y,page.height);
272  if (proceed == MagickFalse)
273  break;
274  }
275  if (y < (ssize_t) page.height)
276  {
277  GlobalUnlock((HGLOBAL) bitmap_bitsH);
278  GlobalFree((HGLOBAL) bitmap_bitsH);
279  return((void *) NULL);
280  }
281  bitmap.bmBits=bitmap_bits;
282  bitmapH=CreateBitmapIndirect(&bitmap);
283  GlobalUnlock((HGLOBAL) bitmap_bitsH);
284  GlobalFree((HGLOBAL) bitmap_bitsH);
285  return((void *) bitmapH);
286 }
287 #endif
288 
289 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
290 /*
291 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
292 % %
293 % %
294 % %
295 % I m a g e T o H B i t m a p %
296 % %
297 % %
298 % %
299 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
300 %
301 % ImageToHBITMAP() creates a Windows HBITMAP from an image.
302 %
303 % The format of the ImageToHBITMAP method is:
304 %
305 % HBITMAP ImageToHBITMAP(Image *image,Exceptioninfo *exception)
306 %
307 % A description of each parameter follows:
308 %
309 % o image: the image to convert.
310 %
311 */
312 MagickExport void *ImageToHBITMAP(Image *image,ExceptionInfo *exception)
313 {
314  BITMAP
315  bitmap;
316 
317  HANDLE
318  bitmap_bitsH;
319 
320  HBITMAP
321  bitmapH;
322 
323  register ssize_t
324  x;
325 
326  register const Quantum
327  *p;
328 
329  register RGBQUAD
330  *q;
331 
332  RGBQUAD
333  *bitmap_bits;
334 
335  size_t
336  length;
337 
338  ssize_t
339  y;
340 
341  (void) memset(&bitmap,0,sizeof(bitmap));
342  bitmap.bmType=0;
343  bitmap.bmWidth=(LONG) image->columns;
344  bitmap.bmHeight=(LONG) image->rows;
345  bitmap.bmWidthBytes=4*bitmap.bmWidth;
346  bitmap.bmPlanes=1;
347  bitmap.bmBitsPixel=32;
348  bitmap.bmBits=NULL;
349  length=bitmap.bmWidthBytes*bitmap.bmHeight;
350  bitmap_bitsH=(HANDLE) GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,length);
351  if (bitmap_bitsH == NULL)
352  {
353  char
354  *message;
355 
356  message=GetExceptionMessage(errno);
357  (void) ThrowMagickException(exception,GetMagickModule(),
358  ResourceLimitError,"MemoryAllocationFailed","`%s'",message);
359  message=DestroyString(message);
360  return(NULL);
361  }
362  bitmap_bits=(RGBQUAD *) GlobalLock((HGLOBAL) bitmap_bitsH);
363  q=bitmap_bits;
364  if (bitmap.bmBits == NULL)
365  bitmap.bmBits=bitmap_bits;
366  (void) SetImageColorspace(image,sRGBColorspace,exception);
367  for (y=0; y < (ssize_t) image->rows; y++)
368  {
369  p=GetVirtualPixels(image,0,y,image->columns,1,exception);
370  if (p == (const Quantum *) NULL)
371  break;
372  for (x=0; x < (ssize_t) image->columns; x++)
373  {
374  q->rgbRed=ScaleQuantumToChar(GetPixelRed(image,p));
375  q->rgbGreen=ScaleQuantumToChar(GetPixelGreen(image,p));
376  q->rgbBlue=ScaleQuantumToChar(GetPixelBlue(image,p));
377  q->rgbReserved=0;
378  p+=GetPixelChannels(image);
379  q++;
380  }
381  }
382  bitmap.bmBits=bitmap_bits;
383  bitmapH=CreateBitmapIndirect(&bitmap);
384  if (bitmapH == NULL)
385  {
386  char
387  *message;
388 
389  message=GetExceptionMessage(errno);
390  (void) ThrowMagickException(exception,GetMagickModule(),
391  ResourceLimitError,"MemoryAllocationFailed","`%s'",message);
392  message=DestroyString(message);
393  }
394  GlobalUnlock((HGLOBAL) bitmap_bitsH);
395  GlobalFree((HGLOBAL) bitmap_bitsH);
396  return((void *) bitmapH);
397 }
398 #endif
399 
400 #endif
size_t rows
Definition: image.h:172
static MagickBooleanType SetImageProgress(const Image *image, const char *tag, const MagickOffsetType offset, const MagickSizeType extent)
static Quantum GetPixelRed(const Image *magick_restrict image, const Quantum *magick_restrict pixel)
size_t signature
Definition: exception.h:123
MagickExport char * GetExceptionMessage(const int error)
Definition: exception.c:466
size_t width
Definition: geometry.h:130
Definition: log.h:52
size_t signature
Definition: magick.h:93
Definition: image.h:151
#define MagickCoreSignature
MagickBooleanType
Definition: magick-type.h:156
MagickExport MagickBooleanType GetMagickSeekableStream(const MagickInfo *magick_info)
Definition: deprecate.c:122
static MagickBooleanType IssRGBCompatibleColorspace(const ColorspaceType colorspace)
MagickStatusType flags
Definition: magick.h:87
MagickExport const Quantum * GetVirtualPixels(const Image *image, const ssize_t x, const ssize_t y, const size_t columns, const size_t rows, ExceptionInfo *exception)
Definition: cache.c:3259
static Quantum GetPixelGreen(const Image *magick_restrict image, const Quantum *magick_restrict pixel)
MagickExport MagickBooleanType ThrowMagickException(ExceptionInfo *exception, const char *module, const char *function, const size_t line, const ExceptionType severity, const char *tag, const char *format,...)
Definition: exception.c:1064
MagickExport MagickBooleanType LogMagickEvent(const LogEventType type, const char *module, const char *function, const size_t line, const char *format,...)
Definition: log.c:1398
size_t signature
Definition: image.h:354
size_t columns
Definition: image.h:172
MagickExport void * ImageToHBITMAP(Image *, ExceptionInfo *)
ssize_t x
Definition: geometry.h:134
size_t height
Definition: geometry.h:130
MagickExport void * CropImageToHBITMAP(Image *, const RectangleInfo *, ExceptionInfo *)
static size_t GetPixelChannels(const Image *magick_restrict image)
char filename[MagickPathExtent]
Definition: image.h:319
#define GetMagickModule()
Definition: log.h:28
#define ThrowImageException(severity, tag)
unsigned short Quantum
Definition: magick-type.h:82
MagickExport MagickBooleanType SetImageColorspace(Image *image, const ColorspaceType colorspace, ExceptionInfo *exception)
Definition: colorspace.c:1134
MagickExport char * DestroyString(char *string)
Definition: string.c:823
#define CropImageTag
#define MagickExport
ssize_t y
Definition: geometry.h:134
static Quantum GetPixelBlue(const Image *magick_restrict image, const Quantum *magick_restrict pixel)
ColorspaceType colorspace
Definition: image.h:157
MagickBooleanType debug
Definition: image.h:334