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 }