• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1
2
3
4
5<!doctype html>
6<html lang="en">
7<head>
8  <meta charset="utf-8"  />
9  <meta name="viewport" content="width=device-width, initial-scale=1"  />
10  <title>ImageMagick - MagickCore, C API: Memory Allocation</title>
11  <meta name="application-name" content="ImageMagick" />
12  <meta name="description" content="Use ImageMagick® to create, edit, compose, and convert digital images. Resize an image, crop it, change its shades and colors, add captions, and more." />
13  <meta name="application-url" content="https://imagemagick.org" />
14  <meta name="generator" content="PHP" />
15  <meta name="keywords" content="magickcore, c, api:, memory, allocation, image processing software" />
16  <meta name="rating" content="GENERAL" />
17  <meta name="robots" content="INDEX, FOLLOW" />
18  <meta name="generator" content="ImageMagick Studio LLC" />
19  <meta name="author" content="ImageMagick Studio LLC" />
20  <meta name="revisit-after" content="2 DAYS" />
21  <meta name="resource-type" content="document" />
22  <meta name="copyright" content="Copyright (c) 1999-2020 ImageMagick Studio LLC" />
23  <meta name="distribution" content="Global" />
24  <meta name="magick-serial" content="P131-S030410-R485315270133-P82224-A6668-G1245-1" />
25  <meta property='og:url' content='../../' />
26  <meta property='og:title' content='ImageMagick' />
27  <meta property='og:image' content='../../../images/logo.png' />
28  <meta property='og:type' content='website' />
29  <meta property='og:site_name' content='ImageMagick' />
30  <meta property='og:description' content="Create, Edit, Compose, or Convert Digital Images" />
31  <meta name="google-site-verification" content="_bMOCDpkx9ZAzBwb2kF3PRHbfUUdFj2uO8Jd1AXArz4" />
32  <link href="memory.html" rel="canonical" />
33  <link href="../../../images/wand.png" rel="icon" />
34  <link href="../../../images/wand.ico" rel="shortcut icon" />
35  <link href="../../assets/magick.css" rel="stylesheet" />
36</head>
37<body>
38  <nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
39  <div class="container-fluid">
40    <a class="navbar-brand" href="../../"><img class="d-block" id="icon" alt="ImageMagick" width="32" height="32" src="../../../images/wand.ico"/></a>
41    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#magick-navbars" aria-controls="magick-navbars" aria-expanded="false" aria-label="Toggle navigation">
42      <span class="navbar-toggler-icon"></span>
43    </button>
44
45    <div class="collapse navbar-collapse" id="magick-navbars">
46      <ul class="navbar-nav me-auto mb-2 mb-md-0">
47        <li class="nav-item">
48          <a class="nav-link " href="../../www/index.html">Home</a>
49        </li>
50        <li class="nav-item">
51          <a class="nav-link " href="../../www/download.html">Download</a>
52        </li>
53        <li class="nav-item">
54          <a class="nav-link " href="../../www/command-line-tools.html">Tools</a>
55        </li>
56        <li class="nav-item">
57          <a class="nav-link " href="../../www/command-line-processing.html">CLI</a>
58        </li>
59        <li class="nav-item">
60          <a class="nav-link " href="../../www/develop.html">Develop</a>
61        </li>
62        <li class="nav-item">
63          <a class="nav-link" target="_blank" href="https://github.com/ImageMagick/ImageMagick/discussions">Community</a>
64        </li>
65        <li class="nav-item">
66          <iframe src="https://github.com/sponsors/ImageMagick/button" title="Sponsor ImageMagick" height="35" width="107" style="border: 0;"></iframe>
67        </li>
68      </ul>
69      <form class="d-flex form-inline" action="https://imagemagick.org/script/search.php">
70        <input class="form-control me-2" type="text" name="q" placeholder="Search" aria-label="Search">
71        <button class="btn btn-outline-success" type="submit" name="sa">Search</button>
72      </form>
73    </div>
74  </div>
75  </nav>
76
77  <div class="container">
78    <script async="async" src="https://localhost/pagead/js/adsbygoogle.js"></script>
79    <ins class="adsbygoogle"
80      style="display:block"
81      data-ad-client="ca-pub-3129977114552745"
82      data-ad-slot="6345125851"
83      data-full-width-responsive="true"
84      data-ad-format="horizontal"></ins>
85    <script>
86      (adsbygoogle = window.adsbygoogle || []).push({});
87    </script>
88
89  </div>
90
91  <main class="container">
92  <div class="magick-template">
93<div class="magick-header">
94<p class="text-center"><a href="memory.html#AcquireCriticalMemory">AcquireCriticalMemory</a> &#8226; <a href="memory.html#AcquireAlignedMemory">AcquireAlignedMemory</a> &#8226; <a href="memory.html#AcquireMagickMemory">AcquireMagickMemory</a> &#8226; <a href="memory.html#AcquireCriticalMemory">AcquireCriticalMemory</a> &#8226; <a href="memory.html#AcquireQuantumMemory">AcquireQuantumMemory</a> &#8226; <a href="memory.html#AcquireVirtualMemory">AcquireVirtualMemory</a> &#8226; <a href="memory.html#CopyMagickMemory">CopyMagickMemory</a> &#8226; <a href="memory.html#GetMagickMemoryMethods">GetMagickMemoryMethods</a> &#8226; <a href="memory.html#GetVirtualMemoryBlob">GetVirtualMemoryBlob</a> &#8226; <a href="memory.html#RelinquishAlignedMemory">RelinquishAlignedMemory</a> &#8226; <a href="memory.html#RelinquishMagickMemory">RelinquishMagickMemory</a> &#8226; <a href="memory.html#RelinquishVirtualMemory">RelinquishVirtualMemory</a> &#8226; <a href="memory.html#ResetMagickMemory">ResetMagickMemory</a> &#8226; <a href="memory.html#ResizeMagickMemory">ResizeMagickMemory</a> &#8226; <a href="memory.html#ResizeQuantumMemory">ResizeQuantumMemory</a> &#8226; <a href="memory.html#SetMagickAlignedMemoryMethods">SetMagickAlignedMemoryMethods</a> &#8226; <a href="memory.html#SetMagickMemoryMethods">SetMagickMemoryMethods</a></p>
95
96<h2><a href="../../api/MagickCore/memory_8c.html" id="AcquireCriticalMemory">AcquireCriticalMemory</a></h2>
97
98<p>AcquireCriticalMemory(): allocate a small memory request with AcquireMagickMemory(), however, on fail throw a fatal exception and exit. Free the memory reserve with RelinquishMagickMemory(). AcquireAlignedMemory(): allocate a small memory request that is aligned on a cache line.  On fail, return NULL for possible recovery. Free the memory reserve with RelinquishMagickMemory(). AcquireMagickMemory()/ResizeMagickMemory(): allocate a small to medium memory request, typically with malloc()/realloc(). On fail, return NULL for possible recovery.  Free the memory reserve with RelinquishMagickMemory(). AcquireQuantumMemory()/ResizeQuantumMemory(): allocate a small to medium memory request.  This is a secure memory allocator as it accepts two parameters, count and quantum, to ensure the request does not overflow. It also check to ensure the request does not exceed the maximum memory per the security policy.  Free the memory reserve with RelinquishMagickMemory(). AcquireVirtualMemory(): allocate a large memory request either in heap, memory-mapped, or memory-mapped on disk depending on whether heap allocation fails or if the request exceeds the maximum memory policy. Free the memory reserve with RelinquishVirtualMemory(). ResetMagickMemory(): fills the bytes of the memory area with a constant byte.</p>
99
100<p>In addition, we provide hooks for your own memory constructor/destructors.</p>
101<dt>utilize our internal custom allocator as follows</dt>
102<p>Segregate our memory requirements from any program that calls our API.  This should help reduce the risk of others changing our program state or causing memory corruption.</p>
103
104<p>Our custom memory allocation manager implements a best-fit allocation policy using segregated free lists.  It uses a linear distribution of size classes for lower sizes and a power of two distribution of size classes at higher sizes.  It is based on the paper, "Fast Memory Allocation using Lazy Fits." written by Yoo C. Chung.</p>
105
106<p>By default, C's standard library is used (e.g. malloc);  use the custom memory allocator by defining MAGICKCORE_ANONYMOUS_MEMORY_SUPPORT to allocate memory with private anonymous mapping rather than from the heap.</p>
107
108<h2><a href="../../api/MagickCore/memory_8c.html" id="AcquireAlignedMemory">AcquireAlignedMemory</a></h2>
109
110<p>AcquireAlignedMemory() returns a pointer to a block of memory whose size is at least (count*quantum) bytes, and whose address is aligned on a cache line.</p>
111
112<p>The format of the AcquireAlignedMemory method is:</p>
113
114<pre class="text">
115void *AcquireAlignedMemory(const size_t count,const size_t quantum)
116</pre>
117
118<p>A description of each parameter follows:</p>
119
120<dd>
121</dd>
122
123<dd> </dd>
124<dl class="dl-horizontal">
125<dt>count</dt>
126<dd>the number of objects to allocate contiguously. </dd>
127
128<dd> </dd>
129<dt>quantum</dt>
130<dd>the size (in bytes) of each object. </dd>
131
132<dd>  </dd>
133</dl>
134<h2><a href="../../api/MagickCore/memory_8c.html" id="AcquireMagickMemory">AcquireMagickMemory</a></h2>
135
136<p>AcquireMagickMemory() returns a pointer to a block of memory at least size bytes suitably aligned for any use.</p>
137
138<p>The format of the AcquireMagickMemory method is:</p>
139
140<pre class="text">
141void *AcquireMagickMemory(const size_t size)
142</pre>
143
144<p>A description of each parameter follows:</p>
145
146<dd>
147</dd>
148
149<dd> </dd>
150<dl class="dl-horizontal">
151<dt>size</dt>
152<dd>the size of the memory in bytes to allocate. </dd>
153
154<dd>  </dd>
155</dl>
156<h2><a href="../../api/MagickCore/memory_8c.html" id="AcquireCriticalMemory">AcquireCriticalMemory</a></h2>
157
158<p>AcquireCriticalMemory() is just like AcquireMagickMemory(), throws a fatal exception if the memory cannot be acquired.</p>
159
160<p>That is, AcquireCriticalMemory() returns a pointer to a block of memory that is at least size bytes, and that is suitably aligned for any use; however, if this is not possible, it throws an exception and terminates the program as unceremoniously as possible.</p>
161
162<p>The format of the AcquireCriticalMemory method is:</p>
163
164<pre class="text">
165void *AcquireCriticalMemory(const size_t size)
166</pre>
167
168<p>A description of each parameter follows:</p>
169
170<dd>
171</dd>
172
173<dd> </dd>
174<dl class="dl-horizontal">
175<dt>size</dt>
176<dd>the size (in bytes) of the memory to allocate. </dd>
177
178<dd>  </dd>
179</dl>
180<h2><a href="../../api/MagickCore/memory_8c.html" id="AcquireQuantumMemory">AcquireQuantumMemory</a></h2>
181
182<p>AcquireQuantumMemory() returns a pointer to a block of memory at least count * quantum bytes suitably aligned for any use.</p>
183
184<p>The format of the AcquireQuantumMemory method is:</p>
185
186<pre class="text">
187void *AcquireQuantumMemory(const size_t count,const size_t quantum)
188</pre>
189
190<p>A description of each parameter follows:</p>
191
192<dd>
193</dd>
194
195<dd> </dd>
196<dl class="dl-horizontal">
197<dt>count</dt>
198<dd>the number of objects to allocate contiguously. </dd>
199
200<dd> </dd>
201<dt>quantum</dt>
202<dd>the size (in bytes) of each object. </dd>
203
204<dd>  </dd>
205</dl>
206<h2><a href="../../api/MagickCore/memory_8c.html" id="AcquireVirtualMemory">AcquireVirtualMemory</a></h2>
207
208<p>AcquireVirtualMemory() allocates a pointer to a block of memory at least size bytes suitably aligned for any use. In addition to heap, it also supports memory-mapped and file-based memory-mapped memory requests.</p>
209
210<p>The format of the AcquireVirtualMemory method is:</p>
211
212<pre class="text">
213MemoryInfo *AcquireVirtualMemory(const size_t count,const size_t quantum)
214</pre>
215
216<p>A description of each parameter follows:</p>
217
218<dd>
219</dd>
220
221<dd> </dd>
222<dl class="dl-horizontal">
223<dt>count</dt>
224<dd>the number of objects to allocate contiguously. </dd>
225
226<dd> </dd>
227<dt>quantum</dt>
228<dd>the size (in bytes) of each object. </dd>
229
230<dd>  </dd>
231</dl>
232<h2><a href="../../api/MagickCore/memory_8c.html" id="CopyMagickMemory">CopyMagickMemory</a></h2>
233
234<p>CopyMagickMemory() copies size bytes from memory area source to the destination.  Copying between objects that overlap will take place correctly.  It returns destination.</p>
235
236<p>The format of the CopyMagickMemory method is:</p>
237
238<pre class="text">
239void *CopyMagickMemory(void *magick_restrict destination,
240  const void *magick_restrict source,const size_t size)
241</pre>
242
243<p>A description of each parameter follows:</p>
244
245<dd>
246</dd>
247
248<dd> </dd>
249<dl class="dl-horizontal">
250<dt>destination</dt>
251<dd>the destination. </dd>
252
253<dd> </dd>
254<dt>source</dt>
255<dd>the source. </dd>
256
257<dd> </dd>
258<dt>size</dt>
259<dd>the size of the memory in bytes to allocate. </dd>
260
261<dd>  </dd>
262</dl>
263<h2><a href="../../api/MagickCore/memory_8c.html" id="GetMagickMemoryMethods">GetMagickMemoryMethods</a></h2>
264
265<p>GetMagickMemoryMethods() gets the methods to acquire, resize, and destroy memory.</p>
266
267<p>The format of the GetMagickMemoryMethods() method is:</p>
268
269<pre class="text">
270void GetMagickMemoryMethods(AcquireMemoryHandler *acquire_memory_handler,
271  ResizeMemoryHandler *resize_memory_handler,
272  DestroyMemoryHandler *destroy_memory_handler)
273</pre>
274
275<p>A description of each parameter follows:</p>
276
277<dd>
278</dd>
279
280<dd> </dd>
281<dl class="dl-horizontal">
282<dt>acquire_memory_handler</dt>
283<dd>method to acquire memory (e.g. malloc). </dd>
284
285<dd> </dd>
286<dt>resize_memory_handler</dt>
287<dd>method to resize memory (e.g. realloc). </dd>
288
289<dd> </dd>
290<dt>destroy_memory_handler</dt>
291<dd>method to destroy memory (e.g. free). </dd>
292
293<dd>  </dd>
294</dl>
295<h2><a href="../../api/MagickCore/memory_8c.html" id="GetVirtualMemoryBlob">GetVirtualMemoryBlob</a></h2>
296
297<p>GetVirtualMemoryBlob() returns the virtual memory blob associated with the specified MemoryInfo structure.</p>
298
299<p>The format of the GetVirtualMemoryBlob method is:</p>
300
301<pre class="text">
302void *GetVirtualMemoryBlob(const MemoryInfo *memory_info)
303</pre>
304
305<p>A description of each parameter follows:</p>
306
307<dd>
308</dd>
309
310<dd> </dd>
311<dl class="dl-horizontal">
312<dt>memory_info</dt>
313<dd>The MemoryInfo structure.  </dd>
314</dl>
315<h2><a href="../../api/MagickCore/memory_8c.html" id="RelinquishAlignedMemory">RelinquishAlignedMemory</a></h2>
316
317<p>RelinquishAlignedMemory() frees memory acquired with AcquireAlignedMemory() or reuse.</p>
318
319<p>The format of the RelinquishAlignedMemory method is:</p>
320
321<pre class="text">
322void *RelinquishAlignedMemory(void *memory)
323</pre>
324
325<p>A description of each parameter follows:</p>
326
327<dd>
328</dd>
329
330<dd> </dd>
331<dl class="dl-horizontal">
332<dt>memory</dt>
333<dd>A pointer to a block of memory to free for reuse. </dd>
334
335<dd>  </dd>
336</dl>
337<h2><a href="../../api/MagickCore/memory_8c.html" id="RelinquishMagickMemory">RelinquishMagickMemory</a></h2>
338
339<p>RelinquishMagickMemory() frees memory acquired with AcquireMagickMemory() or AcquireQuantumMemory() for reuse.</p>
340
341<p>The format of the RelinquishMagickMemory method is:</p>
342
343<pre class="text">
344void *RelinquishMagickMemory(void *memory)
345</pre>
346
347<p>A description of each parameter follows:</p>
348
349<dd>
350</dd>
351
352<dd> </dd>
353<dl class="dl-horizontal">
354<dt>memory</dt>
355<dd>A pointer to a block of memory to free for reuse. </dd>
356
357<dd>  </dd>
358</dl>
359<h2><a href="../../api/MagickCore/memory_8c.html" id="RelinquishVirtualMemory">RelinquishVirtualMemory</a></h2>
360
361<p>RelinquishVirtualMemory() frees memory acquired with AcquireVirtualMemory().</p>
362
363<p>The format of the RelinquishVirtualMemory method is:</p>
364
365<pre class="text">
366MemoryInfo *RelinquishVirtualMemory(MemoryInfo *memory_info)
367</pre>
368
369<p>A description of each parameter follows:</p>
370
371<dd>
372</dd>
373
374<dd> </dd>
375<dl class="dl-horizontal">
376<dt>memory_info</dt>
377<dd>A pointer to a block of memory to free for reuse. </dd>
378
379<dd>  </dd>
380</dl>
381<h2><a href="../../api/MagickCore/memory_8c.html" id="ResetMagickMemory">ResetMagickMemory</a></h2>
382
383<p>ResetMagickMemory() fills the first size bytes of the memory area pointed to by memory with the constant byte c.</p>
384
385<p>The format of the ResetMagickMemory method is:</p>
386
387<pre class="text">
388void *ResetMagickMemory(void *memory,int byte,const size_t size)
389</pre>
390
391<p>A description of each parameter follows:</p>
392
393<dd>
394</dd>
395
396<dd> </dd>
397<dl class="dl-horizontal">
398<dt>memory</dt>
399<dd>a pointer to a memory allocation. </dd>
400
401<dd> </dd>
402<dt>byte</dt>
403<dd>set the memory to this value. </dd>
404
405<dd> </dd>
406<dt>size</dt>
407<dd>size of the memory to reset. </dd>
408
409<dd>  </dd>
410</dl>
411<h2><a href="../../api/MagickCore/memory_8c.html" id="ResizeMagickMemory">ResizeMagickMemory</a></h2>
412
413<p>ResizeMagickMemory() changes the size of the memory and returns a pointer to the (possibly moved) block.  The contents will be unchanged up to the lesser of the new and old sizes.</p>
414
415<p>The format of the ResizeMagickMemory method is:</p>
416
417<pre class="text">
418void *ResizeMagickMemory(void *memory,const size_t size)
419</pre>
420
421<p>A description of each parameter follows:</p>
422
423<dd>
424</dd>
425
426<dd> </dd>
427<dl class="dl-horizontal">
428<dt>memory</dt>
429<dd>A pointer to a memory allocation. </dd>
430
431<dd> </dd>
432<dt>size</dt>
433<dd>the new size of the allocated memory. </dd>
434
435<dd>  </dd>
436</dl>
437<h2><a href="../../api/MagickCore/memory_8c.html" id="ResizeQuantumMemory">ResizeQuantumMemory</a></h2>
438
439<p>ResizeQuantumMemory() changes the size of the memory and returns a pointer to the (possibly moved) block.  The contents will be unchanged up to the lesser of the new and old sizes.</p>
440
441<p>The format of the ResizeQuantumMemory method is:</p>
442
443<pre class="text">
444void *ResizeQuantumMemory(void *memory,const size_t count,
445  const size_t quantum)
446</pre>
447
448<p>A description of each parameter follows:</p>
449
450<dd>
451</dd>
452
453<dd> </dd>
454<dl class="dl-horizontal">
455<dt>memory</dt>
456<dd>A pointer to a memory allocation. </dd>
457
458<dd> </dd>
459<dt>count</dt>
460<dd>the number of objects to allocate contiguously. </dd>
461
462<dd> </dd>
463<dt>quantum</dt>
464<dd>the size (in bytes) of each object. </dd>
465
466<dd>  </dd>
467</dl>
468<h2><a href="../../api/MagickCore/memory_8c.html" id="SetMagickAlignedMemoryMethods">SetMagickAlignedMemoryMethods</a></h2>
469
470<p>SetMagickAlignedMemoryMethods() sets the methods to acquire and relinquish aligned memory.</p>
471
472<p>The format of the SetMagickAlignedMemoryMethods() method is:</p>
473
474<pre class="text">
475SetMagickAlignedMemoryMethods(
476  AcquireAlignedMemoryHandler acquire_aligned_memory_handler,
477  RelinquishAlignedMemoryHandler relinquish_aligned_memory_handler)
478</pre>
479
480<p>A description of each parameter follows:</p>
481
482<dd>
483</dd>
484
485<dd> </dd>
486<dl class="dl-horizontal">
487<dt>acquire_memory_handler</dt>
488<dd>method to acquire aligned memory. </dd>
489
490<dd> </dd>
491<dt>relinquish_aligned_memory_handler</dt>
492<dd>method to relinquish aligned memory. </dd>
493
494<dd>  </dd>
495</dl>
496<h2><a href="../../api/MagickCore/memory_8c.html" id="SetMagickMemoryMethods">SetMagickMemoryMethods</a></h2>
497
498<p>SetMagickMemoryMethods() sets the methods to acquire, resize, and destroy memory. Your custom memory methods must be set prior to the MagickCoreGenesis() method.</p>
499
500<p>The format of the SetMagickMemoryMethods() method is:</p>
501
502<pre class="text">
503SetMagickMemoryMethods(AcquireMemoryHandler acquire_memory_handler,
504  ResizeMemoryHandler resize_memory_handler,
505  DestroyMemoryHandler destroy_memory_handler)
506</pre>
507
508<p>A description of each parameter follows:</p>
509
510<dd>
511</dd>
512
513<dd> </dd>
514<dl class="dl-horizontal">
515<dt>acquire_memory_handler</dt>
516<dd>method to acquire memory (e.g. malloc). </dd>
517
518<dd> </dd>
519<dt>resize_memory_handler</dt>
520<dd>method to resize memory (e.g. realloc). </dd>
521
522<dd> </dd>
523<dt>destroy_memory_handler</dt>
524<dd>method to destroy memory (e.g. free). </dd>
525
526<dd>  </dd>
527</dl>
528</div>
529  </div>
530  </main><!-- /.container -->
531  <footer class="magick-footer">
532    <div class="container-fluid">
533      <a href="../../www/security-policy.html">Security</a> •
534      <a href="../../www/news.html">News</a>
535
536      <a href="memory.html#"><img class="d-inline" id="wand" alt="And Now a Touch of Magick" width="16" height="16" src="../../../images/wand.ico"/></a>
537
538      <a href="../../www/links.html">Related</a> •
539      <a href="../../www/sitemap.html">Sitemap</a>
540   <br/>
541     <a href="../../www/support.html">Sponsor</a> •
542     <a href="../../www/cite.html">Cite</a> •
543     <a href="http://pgp.mit.edu/pks/lookup?op=get&amp;search=0x89AB63D48277377A">Public Key</a> •
544     <a href="../../www/contact.html">Contact Us</a>
545   <br/>
546     <a href="https://github.com/imagemagick/imagemagick" target="_blank" rel="noopener" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="navbar-nav-svg" viewBox="0 0 512 499.36" width="2%" height="2%" role="img" focusable="false"><title>GitHub</title><path fill="currentColor" fill-rule="evenodd" d="M256 0C114.64 0 0 114.61 0 256c0 113.09 73.34 209 175.08 242.9 12.8 2.35 17.47-5.56 17.47-12.34 0-6.08-.22-22.18-.35-43.54-71.2 15.49-86.2-34.34-86.2-34.34-11.64-29.57-28.42-37.45-28.42-37.45-23.27-15.84 1.73-15.55 1.73-15.55 25.69 1.81 39.21 26.38 39.21 26.38 22.84 39.12 59.92 27.82 74.5 21.27 2.33-16.54 8.94-27.82 16.25-34.22-56.84-6.43-116.6-28.43-116.6-126.49 0-27.95 10-50.8 26.35-68.69-2.63-6.48-11.42-32.5 2.51-67.75 0 0 21.49-6.88 70.4 26.24a242.65 242.65 0 0 1 128.18 0c48.87-33.13 70.33-26.24 70.33-26.24 14 35.25 5.18 61.27 2.55 67.75 16.41 17.9 26.31 40.75 26.31 68.69 0 98.35-59.85 120-116.88 126.32 9.19 7.9 17.38 23.53 17.38 47.41 0 34.22-.31 61.83-.31 70.23 0 6.85 4.61 14.81 17.6 12.31C438.72 464.97 512 369.08 512 256.02 512 114.62 397.37 0 256 0z"/></svg></a> •
547     <a href="https://twitter.com/imagemagick" target="_blank" rel="noopener" aria-label="Twitter"><svg xmlns="http://www.w3.org/2000/svg" class="navbar-nav-svg" viewBox="0 0 512 416.32" width="2%" height="2%" role="img" focusable="false"><title>Twitter</title><path fill="currentColor" d="M160.83 416.32c193.2 0 298.92-160.22 298.92-298.92 0-4.51 0-9-.2-13.52A214 214 0 0 0 512 49.38a212.93 212.93 0 0 1-60.44 16.6 105.7 105.7 0 0 0 46.3-58.19 209 209 0 0 1-66.79 25.37 105.09 105.09 0 0 0-181.73 71.91 116.12 116.12 0 0 0 2.66 24c-87.28-4.3-164.73-46.3-216.56-109.82A105.48 105.48 0 0 0 68 159.6a106.27 106.27 0 0 1-47.53-13.11v1.43a105.28 105.28 0 0 0 84.21 103.06 105.67 105.67 0 0 1-47.33 1.84 105.06 105.06 0 0 0 98.14 72.94A210.72 210.72 0 0 1 25 370.84a202.17 202.17 0 0 1-25-1.43 298.85 298.85 0 0 0 160.83 46.92"/></svg></a>
548    <br/>
549    <small>© 1999-2021 ImageMagick Studio LLC</small>
550    </div>
551  </footer>
552
553  <!-- Javascript assets -->
554  <script src="../../assets/magick.js" ></script>
555  </body>
556</html>
557