1 /*
2  * This file is part of gtkD.
3  *
4  * gtkD is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License
6  * as published by the Free Software Foundation; either version 3
7  * of the License, or (at your option) any later version, with
8  * some exceptions, please read the COPYING file.
9  *
10  * gtkD is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with gtkD; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
18  */
19 
20 // generated automatically - do not change
21 // find conversion definition on APILookup.txt
22 // implement new conversion functionalities on the wrap.utils pakage
23 
24 
25 module rsvg.Handle;
26 
27 private import cairo.Context;
28 private import gdkpixbuf.Pixbuf;
29 private import gio.Cancellable;
30 private import gio.FileIF;
31 private import gio.InputStream;
32 private import glib.ConstructionException;
33 private import glib.ErrorG;
34 private import glib.GException;
35 private import glib.Str;
36 private import gobject.ObjectG;
37 private import rsvg.c.functions;
38 public  import rsvg.c.types;
39 
40 
41 /**
42  * Lets you load SVG data and render it.
43  */
44 public class Handle : ObjectG
45 {
46 	/** the main Gtk struct */
47 	protected RsvgHandle* rsvgHandle;
48 
49 	/** Get the main Gtk struct */
50 	public RsvgHandle* getHandleStruct(bool transferOwnership = false)
51 	{
52 		if (transferOwnership)
53 			ownedRef = false;
54 		return rsvgHandle;
55 	}
56 
57 	/** the main Gtk struct as a void* */
58 	protected override void* getStruct()
59 	{
60 		return cast(void*)rsvgHandle;
61 	}
62 
63 	/**
64 	 * Sets our main struct and passes it to the parent class.
65 	 */
66 	public this (RsvgHandle* rsvgHandle, bool ownedRef = false)
67 	{
68 		this.rsvgHandle = rsvgHandle;
69 		super(cast(GObject*)rsvgHandle, ownedRef);
70 	}
71 
72 
73 	/** */
74 	public static GType getType()
75 	{
76 		return rsvg_handle_get_type();
77 	}
78 
79 	/**
80 	 * Returns a new rsvg handle.  Must be freed with @g_object_unref.  This
81 	 * handle can be used for dynamically loading an image.  You need to feed it
82 	 * data using @rsvg_handle_write, then call @rsvg_handle_close when done.
83 	 * Afterwords, you can render it using Cairo or get a GdkPixbuf from it. When
84 	 * finished, free with g_object_unref(). No more than one image can be loaded
85 	 * with one handle.
86 	 *
87 	 * Returns: A new #RsvgHandle
88 	 *
89 	 * Throws: ConstructionException GTK+ fails to create the object.
90 	 */
91 	public this()
92 	{
93 		auto p = rsvg_handle_new();
94 
95 		if(p is null)
96 		{
97 			throw new ConstructionException("null returned by new");
98 		}
99 
100 		this(cast(RsvgHandle*) p, true);
101 	}
102 
103 	/**
104 	 * Loads the SVG specified by @data.
105 	 *
106 	 * Params:
107 	 *     data = The SVG data
108 	 *
109 	 * Returns: A #RsvgHandle or %NULL if an error occurs.
110 	 *
111 	 * Since: 2.14
112 	 *
113 	 * Throws: GException on failure.
114 	 * Throws: ConstructionException GTK+ fails to create the object.
115 	 */
116 	public this(ubyte[] data)
117 	{
118 		GError* err = null;
119 
120 		auto p = rsvg_handle_new_from_data(data.ptr, cast(size_t)data.length, &err);
121 
122 		if (err !is null)
123 		{
124 			throw new GException( new ErrorG(err) );
125 		}
126 
127 		if(p is null)
128 		{
129 			throw new ConstructionException("null returned by new_from_data");
130 		}
131 
132 		this(cast(RsvgHandle*) p, true);
133 	}
134 
135 	/**
136 	 * Loads the SVG specified by @file_name.
137 	 *
138 	 * Params:
139 	 *     fileName = The file name to load. If built with gnome-vfs, can be a URI.
140 	 *
141 	 * Returns: A #RsvgHandle or %NULL if an error occurs.
142 	 *
143 	 * Since: 2.14
144 	 *
145 	 * Throws: GException on failure.
146 	 * Throws: ConstructionException GTK+ fails to create the object.
147 	 */
148 	public this(string fileName)
149 	{
150 		GError* err = null;
151 
152 		auto p = rsvg_handle_new_from_file(Str.toStringz(fileName), &err);
153 
154 		if (err !is null)
155 		{
156 			throw new GException( new ErrorG(err) );
157 		}
158 
159 		if(p is null)
160 		{
161 			throw new ConstructionException("null returned by new_from_file");
162 		}
163 
164 		this(cast(RsvgHandle*) p, true);
165 	}
166 
167 	/**
168 	 * Creates a new #RsvgHandle for @file.
169 	 *
170 	 * If @cancellable is not %NULL, then the operation can be cancelled by
171 	 * triggering the cancellable object from another thread. If the
172 	 * operation was cancelled, the error %G_IO_ERROR_CANCELLED will be
173 	 * returned.
174 	 *
175 	 * Params:
176 	 *     file = a #GFile
177 	 *     flags = flags from #RsvgHandleFlags
178 	 *     cancellable = a #GCancellable, or %NULL
179 	 *
180 	 * Returns: a new #RsvgHandle on success, or %NULL with @error filled in
181 	 *
182 	 * Since: 2.32
183 	 *
184 	 * Throws: GException on failure.
185 	 * Throws: ConstructionException GTK+ fails to create the object.
186 	 */
187 	public this(FileIF file, RsvgHandleFlags flags, Cancellable cancellable)
188 	{
189 		GError* err = null;
190 
191 		auto p = rsvg_handle_new_from_gfile_sync((file is null) ? null : file.getFileStruct(), flags, (cancellable is null) ? null : cancellable.getCancellableStruct(), &err);
192 
193 		if (err !is null)
194 		{
195 			throw new GException( new ErrorG(err) );
196 		}
197 
198 		if(p is null)
199 		{
200 			throw new ConstructionException("null returned by new_from_gfile_sync");
201 		}
202 
203 		this(cast(RsvgHandle*) p, true);
204 	}
205 
206 	/**
207 	 * Creates a new #RsvgHandle for @stream.
208 	 *
209 	 * If @cancellable is not %NULL, then the operation can be cancelled by
210 	 * triggering the cancellable object from another thread. If the
211 	 * operation was cancelled, the error %G_IO_ERROR_CANCELLED will be
212 	 * returned.
213 	 *
214 	 * Params:
215 	 *     inputStream = a #GInputStream
216 	 *     baseFile = a #GFile, or %NULL
217 	 *     flags = flags from #RsvgHandleFlags
218 	 *     cancellable = a #GCancellable, or %NULL
219 	 *
220 	 * Returns: a new #RsvgHandle on success, or %NULL with @error filled in
221 	 *
222 	 * Since: 2.32
223 	 *
224 	 * Throws: GException on failure.
225 	 * Throws: ConstructionException GTK+ fails to create the object.
226 	 */
227 	public this(InputStream inputStream, FileIF baseFile, RsvgHandleFlags flags, Cancellable cancellable)
228 	{
229 		GError* err = null;
230 
231 		auto p = rsvg_handle_new_from_stream_sync((inputStream is null) ? null : inputStream.getInputStreamStruct(), (baseFile is null) ? null : baseFile.getFileStruct(), flags, (cancellable is null) ? null : cancellable.getCancellableStruct(), &err);
232 
233 		if (err !is null)
234 		{
235 			throw new GException( new ErrorG(err) );
236 		}
237 
238 		if(p is null)
239 		{
240 			throw new ConstructionException("null returned by new_from_stream_sync");
241 		}
242 
243 		this(cast(RsvgHandle*) p, true);
244 	}
245 
246 	/**
247 	 * Creates a new #RsvgHandle with flags @flags.
248 	 *
249 	 * Params:
250 	 *     flags = flags from #RsvgHandleFlags
251 	 *
252 	 * Returns: a new #RsvgHandle
253 	 *
254 	 * Since: 2.36
255 	 *
256 	 * Throws: ConstructionException GTK+ fails to create the object.
257 	 */
258 	public this(RsvgHandleFlags flags)
259 	{
260 		auto p = rsvg_handle_new_with_flags(flags);
261 
262 		if(p is null)
263 		{
264 			throw new ConstructionException("null returned by new_with_flags");
265 		}
266 
267 		this(cast(RsvgHandle*) p, true);
268 	}
269 
270 	/**
271 	 * Closes @handle, to indicate that loading the image is complete.  This will
272 	 * return %TRUE if the loader closed successfully.  Note that @handle isn't
273 	 * freed until @g_object_unref is called.
274 	 *
275 	 * Returns: %TRUE on success, or %FALSE on error
276 	 *
277 	 * Throws: GException on failure.
278 	 */
279 	public bool close()
280 	{
281 		GError* err = null;
282 
283 		auto p = rsvg_handle_close(rsvgHandle, &err) != 0;
284 
285 		if (err !is null)
286 		{
287 			throw new GException( new ErrorG(err) );
288 		}
289 
290 		return p;
291 	}
292 
293 	/**
294 	 * Gets the base uri for this #RsvgHandle.
295 	 *
296 	 * Returns: the base uri, possibly null
297 	 *
298 	 * Since: 2.8
299 	 */
300 	public string getBaseUri()
301 	{
302 		return Str.toString(rsvg_handle_get_base_uri(rsvgHandle));
303 	}
304 
305 	/**
306 	 * Get the SVG's size. Do not call from within the size_func callback, because an infinite loop will occur.
307 	 *
308 	 * Params:
309 	 *     dimensionData = A place to store the SVG's size
310 	 *
311 	 * Since: 2.14
312 	 */
313 	public void getDimensions(out RsvgDimensionData dimensionData)
314 	{
315 		rsvg_handle_get_dimensions(rsvgHandle, &dimensionData);
316 	}
317 
318 	/**
319 	 * Get the size of a subelement of the SVG file. Do not call from within the
320 	 * size_func callback, because an infinite loop will occur.
321 	 *
322 	 * Params:
323 	 *     dimensionData = A place to store the SVG's size
324 	 *     id = An element's id within the SVG, starting with "##", for
325 	 *         example, "##layer1"; or %NULL to use the whole SVG.
326 	 *
327 	 * Since: 2.22
328 	 */
329 	public bool getDimensionsSub(out RsvgDimensionData dimensionData, string id)
330 	{
331 		return rsvg_handle_get_dimensions_sub(rsvgHandle, &dimensionData, Str.toStringz(id)) != 0;
332 	}
333 
334 	/**
335 	 * Returns the pixbuf loaded by @handle.  The pixbuf returned will be reffed, so
336 	 * the caller of this function must assume that ref.  If insufficient data has
337 	 * been read to create the pixbuf, or an error occurred in loading, then %NULL
338 	 * will be returned.  Note that the pixbuf may not be complete until
339 	 * @rsvg_handle_close has been called.
340 	 *
341 	 * Returns: the pixbuf loaded by @handle, or %NULL.
342 	 */
343 	public Pixbuf getPixbuf()
344 	{
345 		auto p = rsvg_handle_get_pixbuf(rsvgHandle);
346 
347 		if(p is null)
348 		{
349 			return null;
350 		}
351 
352 		return ObjectG.getDObject!(Pixbuf)(cast(GdkPixbuf*) p, true);
353 	}
354 
355 	/**
356 	 * Creates a #GdkPixbuf the same size as the entire SVG loaded into @handle, but
357 	 * only renders the sub-element that has the specified @id (and all its
358 	 * sub-sub-elements recursively).  If @id is #NULL, this function renders the
359 	 * whole SVG.
360 	 *
361 	 * If you need to render an image which is only big enough to fit a particular
362 	 * sub-element of the SVG, consider using rsvg_handle_render_cairo_sub(), upon a
363 	 * surface that is just the size returned by rsvg_handle_get_dimensions_sub().
364 	 * You will need to offset the rendering by the amount returned in
365 	 * rsvg_handle_get_position_sub().
366 	 *
367 	 * Params:
368 	 *     id = An element's id within the SVG, starting with "##", for
369 	 *         example, "##layer1"; or %NULL to use the whole SVG.
370 	 *
371 	 * Returns: a pixbuf, or %NULL if an error occurs
372 	 *     during rendering.
373 	 *
374 	 * Since: 2.14
375 	 */
376 	public Pixbuf getPixbufSub(string id)
377 	{
378 		auto p = rsvg_handle_get_pixbuf_sub(rsvgHandle, Str.toStringz(id));
379 
380 		if(p is null)
381 		{
382 			return null;
383 		}
384 
385 		return ObjectG.getDObject!(Pixbuf)(cast(GdkPixbuf*) p, true);
386 	}
387 
388 	/**
389 	 * Get the position of a subelement of the SVG file. Do not call from within
390 	 * the size_func callback, because an infinite loop will occur.
391 	 *
392 	 * Params:
393 	 *     positionData = A place to store the SVG fragment's position.
394 	 *     id = An element's id within the SVG, starting with "##", for
395 	 *         example, "##layer1"; or %NULL to use the whole SVG.
396 	 *
397 	 * Since: 2.22
398 	 */
399 	public bool getPositionSub(out RsvgPositionData positionData, string id)
400 	{
401 		return rsvg_handle_get_position_sub(rsvgHandle, &positionData, Str.toStringz(id)) != 0;
402 	}
403 
404 	/**
405 	 * Checks whether the element @id exists in the SVG document.
406 	 *
407 	 * Params:
408 	 *     id = an element's id within the SVG, starting with "##", for example, "##layer1".
409 	 *
410 	 * Returns: %TRUE if @id exists in the SVG document
411 	 *
412 	 * Since: 2.22
413 	 */
414 	public bool hasSub(string id)
415 	{
416 		return rsvg_handle_has_sub(rsvgHandle, Str.toStringz(id)) != 0;
417 	}
418 
419 	/** */
420 	public void internalSetTesting(bool testing)
421 	{
422 		rsvg_handle_internal_set_testing(rsvgHandle, testing);
423 	}
424 
425 	/**
426 	 * Reads @stream and writes the data from it to @handle.
427 	 *
428 	 * If @cancellable is not %NULL, then the operation can be cancelled by
429 	 * triggering the cancellable object from another thread. If the
430 	 * operation was cancelled, the error %G_IO_ERROR_CANCELLED will be
431 	 * returned.
432 	 *
433 	 * Params:
434 	 *     stream = a #GInputStream
435 	 *     cancellable = a #GCancellable, or %NULL
436 	 *
437 	 * Returns: %TRUE if reading @stream succeeded, or %FALSE otherwise
438 	 *     with @error filled in
439 	 *
440 	 * Since: 2.32
441 	 *
442 	 * Throws: GException on failure.
443 	 */
444 	public bool readStreamSync(InputStream stream, Cancellable cancellable)
445 	{
446 		GError* err = null;
447 
448 		auto p = rsvg_handle_read_stream_sync(rsvgHandle, (stream is null) ? null : stream.getInputStreamStruct(), (cancellable is null) ? null : cancellable.getCancellableStruct(), &err) != 0;
449 
450 		if (err !is null)
451 		{
452 			throw new GException( new ErrorG(err) );
453 		}
454 
455 		return p;
456 	}
457 
458 	/**
459 	 * Draws a SVG to a Cairo surface
460 	 *
461 	 * Params:
462 	 *     cr = A Cairo renderer
463 	 *
464 	 * Returns: %TRUE if drawing succeeded.
465 	 *
466 	 * Since: 2.14
467 	 */
468 	public bool renderCairo(Context cr)
469 	{
470 		return rsvg_handle_render_cairo(rsvgHandle, (cr is null) ? null : cr.getContextStruct()) != 0;
471 	}
472 
473 	/**
474 	 * Draws a subset of a SVG to a Cairo surface
475 	 *
476 	 * Params:
477 	 *     cr = A Cairo renderer
478 	 *     id = An element's id within the SVG, or %NULL to render
479 	 *         the whole SVG. For example, if you have a layer called "layer1"
480 	 *         that you wish to render, pass "##layer1" as the id.
481 	 *
482 	 * Returns: %TRUE if drawing succeeded.
483 	 *
484 	 * Since: 2.14
485 	 */
486 	public bool renderCairoSub(Context cr, string id)
487 	{
488 		return rsvg_handle_render_cairo_sub(rsvgHandle, (cr is null) ? null : cr.getContextStruct(), Str.toStringz(id)) != 0;
489 	}
490 
491 	/**
492 	 * Set the base URI for @handle from @file.
493 	 * Note: This function may only be called before rsvg_handle_write()
494 	 * or rsvg_handle_read_stream_sync() has been called.
495 	 *
496 	 * Params:
497 	 *     baseFile = a #GFile
498 	 *
499 	 * Since: 2.32
500 	 */
501 	public void setBaseGfile(FileIF baseFile)
502 	{
503 		rsvg_handle_set_base_gfile(rsvgHandle, (baseFile is null) ? null : baseFile.getFileStruct());
504 	}
505 
506 	/**
507 	 * Set the base URI for this SVG. This can only be called before rsvg_handle_write()
508 	 * has been called.
509 	 *
510 	 * Params:
511 	 *     baseUri = The base uri
512 	 *
513 	 * Since: 2.9
514 	 */
515 	public void setBaseUri(string baseUri)
516 	{
517 		rsvg_handle_set_base_uri(rsvgHandle, Str.toStringz(baseUri));
518 	}
519 
520 	/**
521 	 * Sets the DPI for the outgoing pixbuf. Common values are
522 	 * 75, 90, and 300 DPI. Passing a number <= 0 to @dpi will
523 	 * reset the DPI to whatever the default value happens to be.
524 	 *
525 	 * Params:
526 	 *     dpi = Dots Per Inch (aka Pixels Per Inch)
527 	 *
528 	 * Since: 2.8
529 	 */
530 	public void setDpi(double dpi)
531 	{
532 		rsvg_handle_set_dpi(rsvgHandle, dpi);
533 	}
534 
535 	/**
536 	 * Sets the DPI for the outgoing pixbuf. Common values are
537 	 * 75, 90, and 300 DPI. Passing a number <= 0 to #dpi_x or @dpi_y will
538 	 * reset the DPI to whatever the default value happens to be.
539 	 *
540 	 * Params:
541 	 *     dpiX = Dots Per Inch (aka Pixels Per Inch)
542 	 *     dpiY = Dots Per Inch (aka Pixels Per Inch)
543 	 *
544 	 * Since: 2.8
545 	 */
546 	public void setDpiXY(double dpiX, double dpiY)
547 	{
548 		rsvg_handle_set_dpi_x_y(rsvgHandle, dpiX, dpiY);
549 	}
550 
551 	/**
552 	 * Loads the next @count bytes of the image.  This will return %TRUE if the data
553 	 * was loaded successful, and %FALSE if an error occurred.  In the latter case,
554 	 * the loader will be closed, and will not accept further writes. If %FALSE is
555 	 * returned, @error will be set to an error from the #RsvgError domain. Errors
556 	 * from #GIOErrorEnum are also possible.
557 	 *
558 	 * Params:
559 	 *     buf = pointer to svg data
560 	 *
561 	 * Returns: %TRUE on success, or %FALSE on error
562 	 *
563 	 * Throws: GException on failure.
564 	 */
565 	public bool write(char[] buf)
566 	{
567 		GError* err = null;
568 
569 		auto p = rsvg_handle_write(rsvgHandle, buf.ptr, cast(size_t)buf.length, &err) != 0;
570 
571 		if (err !is null)
572 		{
573 			throw new GException( new ErrorG(err) );
574 		}
575 
576 		return p;
577 	}
578 
579 	/**
580 	 * Do not use this function.  Create an #RsvgHandle and call
581 	 * rsvg_handle_set_dpi() on it instead.
582 	 *
583 	 * Deprecated: This function used to set a global default DPI.  However,
584 	 * it only worked if it was called before any #RsvgHandle objects had been
585 	 * created; it would not work after that.  To avoid global mutable state, please
586 	 * use rsvg_handle_set_dpi() instead.
587 	 *
588 	 * Params:
589 	 *     dpi = Dots Per Inch (aka Pixels Per Inch)
590 	 *
591 	 * Since: 2.8
592 	 */
593 	public static void setDefaultDpi(double dpi)
594 	{
595 		rsvg_set_default_dpi(dpi);
596 	}
597 
598 	/**
599 	 * Do not use this function.  Create an #RsvgHandle and call
600 	 * rsvg_handle_set_dpi_x_y() on it instead.
601 	 *
602 	 * Deprecated: This function used to set a global default DPI.  However,
603 	 * it only worked if it was called before any #RsvgHandle objects had been
604 	 * created; it would not work after that.  To avoid global mutable state, please
605 	 * use rsvg_handle_set_dpi() instead.
606 	 *
607 	 * Params:
608 	 *     dpiX = Dots Per Inch (aka Pixels Per Inch)
609 	 *     dpiY = Dots Per Inch (aka Pixels Per Inch)
610 	 *
611 	 * Since: 2.8
612 	 */
613 	public static void setDefaultDpiXY(double dpiX, double dpiY)
614 	{
615 		rsvg_set_default_dpi_x_y(dpiX, dpiY);
616 	}
617 }