MagickWand 7.1.2-31
Convert, Edit, Or Compose Bitmap Images
Loading...
Searching...
No Matches
wand.c
1/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3% %
4% %
5% %
6% W W AAA N N DDDD %
7% W W A A NN N D D %
8% W W W AAAAA N N N D D %
9% WW WW A A N NN D D %
10% W W A A N N DDDD %
11% %
12% %
13% MagickWand Support Methods %
14% %
15% Software Design %
16% Cristy %
17% May 2004 %
18% %
19% %
20% Copyright @ 1999 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/license/ %
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% Assign unique ID's to each magick wand. We store the ID's in a splay-tree
37% to track which ID's persist and which were destroyed.
38%
39%
40*/
41
42/*
43 Include declarations.
44*/
45#include "MagickWand/studio.h"
46#include "MagickWand/MagickWand.h"
47#include "MagickWand/magick-wand-private.h"
48#include "MagickWand/wand.h"
49
50static SplayTreeInfo
51 *wand_ids = (SplayTreeInfo *) NULL;
52
53static SemaphoreInfo
54 *wand_semaphore = (SemaphoreInfo *) NULL;
55
56/*
57%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58% %
59% %
60% %
61% A c q u i r e W a n d I d %
62% %
63% %
64% %
65%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
66%
67% AcquireWandId() returns a unique wand id.
68%
69% The format of the AcquireWandId() method is:
70%
71% size_t AcquireWandId()
72%
73*/
74WandExport size_t AcquireWandId(void)
75{
76 MagickAddressType
77 wand_id;
78
79 static size_t
80 id = 0;
81
82 if (wand_semaphore == (SemaphoreInfo *) NULL)
83 ActivateSemaphoreInfo(&wand_semaphore);
84 LockSemaphoreInfo(wand_semaphore);
85 if (wand_ids == (SplayTreeInfo *) NULL)
86 wand_ids=NewSplayTree((int (*)(const void *,const void *)) NULL,
87 (void *(*)(void *)) NULL,(void *(*)(void *)) NULL);
88 wand_id=id++;
89 (void) AddValueToSplayTree(wand_ids,(const void *) wand_id,(const void *)
90 wand_id);
91 UnlockSemaphoreInfo(wand_semaphore);
92 return((size_t) wand_id);
93}
94
95/*
96%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
97% %
98% %
99% %
100% D e s t r o y W a n d I d s %
101% %
102% %
103% %
104%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
105%
106% DestroyWandIds() deallocates memory associated with the wand id's.
107%
108% The format of the DestroyWandIds() method is:
109%
110% void DestroyWandIds(void)
111%
112% A description of each parameter follows:
113%
114*/
115WandExport void DestroyWandIds(void)
116{
117 if (wand_semaphore == (SemaphoreInfo *) NULL)
118 ActivateSemaphoreInfo(&wand_semaphore);
119 LockSemaphoreInfo(wand_semaphore);
120 if (wand_ids != (SplayTreeInfo *) NULL)
121 wand_ids=DestroySplayTree(wand_ids);
122 UnlockSemaphoreInfo(wand_semaphore);
123 RelinquishSemaphoreInfo(&wand_semaphore);
124}
125
126/*
127%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
128% %
129% %
130% %
131% R e l i n q u i s h W a n d I d %
132% %
133% %
134% %
135%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
136%
137% RelinquishWandId() relinquishes a unique wand id.
138%
139% The format of the RelinquishWandId() method is:
140%
141% void RelinquishWandId(const size_t *id)
142%
143% A description of each parameter follows:
144%
145% o id: a unique wand id.
146%
147*/
148WandExport void RelinquishWandId(const size_t id)
149{
150 MagickAddressType
151 wand_id = (MagickAddressType) id;
152
153 LockSemaphoreInfo(wand_semaphore);
154 if (wand_ids != (SplayTreeInfo *) NULL)
155 (void) DeleteNodeFromSplayTree(wand_ids,(const void *) wand_id);
156 UnlockSemaphoreInfo(wand_semaphore);
157}