1 /** 2 * License: 3 * $(TABLE 4 * $(TR $(TD cairoD wrapper/bindings) 5 * $(TD $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0))) 6 * $(TR $(TD $(LINK2 http://cgit.freedesktop.org/cairo/tree/COPYING, _cairo)) 7 * $(TD $(LINK2 http://cgit.freedesktop.org/cairo/tree/COPYING-LGPL-2.1, LGPL 2.1) / 8 * $(LINK2 http://cgit.freedesktop.org/cairo/plain/COPYING-MPL-1.1, MPL 1.1))) 9 * ) 10 * Authors: 11 * $(TABLE 12 * $(TR $(TD Johannes Pfau) $(TD cairoD)) 13 * $(TR $(TD $(LINK2 http://cairographics.org, _cairo team)) $(TD _cairo)) 14 * ) 15 */ 16 /* 17 * Distributed under the Boost Software License, Version 1.0. 18 * (See accompanying file LICENSE_1_0.txt or copy at 19 * http://www.boost.org/LICENSE_1_0.txt) 20 */ 21 module cairo.svg; 22 23 import std.string; 24 import std.conv; 25 26 import cairo.cairo; 27 import cairo.c.cairo; 28 29 static if(CAIRO_HAS_SVG_SURFACE) 30 { 31 import cairo.c.svg; 32 /// 33 public alias cairo_svg_version_t SVGVersion; 34 35 /** 36 * Used to retrieve the list of supported versions. 37 * See $(D SVGSurface.restrictToVersion()). 38 */ 39 SVGVersion[] getSVGVersions() 40 { 41 int num; 42 immutable(cairo_svg_version_t*) vers; 43 cairo_svg_get_versions(&vers, &num); 44 SVGVersion[] dvers; 45 for(int i = 0; i < num; i++) 46 { 47 dvers ~= vers[i]; 48 } 49 return dvers; 50 } 51 52 /** 53 * Get the string representation of the given version id. This 54 * function will return null if version isn't valid. 55 * See $(D getSVGVersions()) for a way to get the list of 56 * valid version ids. 57 */ 58 string SVGVersionToString(SVGVersion vers) 59 { 60 return to!string(cairo_svg_version_to_string(vers)); 61 } 62 63 /** 64 * The SVG surface is used to render cairo graphics to SVG 65 * files and is a multi-page vector surface backend. 66 */ 67 public class SVGSurface : Surface 68 { 69 public: 70 /** 71 * Create a $(D SVGSurface) from a existing $(D cairo_surface_t*). 72 * SVGSurface is a garbage collected class. It will call $(D cairo_surface_destroy) 73 * when it gets collected by the GC or when $(D dispose()) is called. 74 * 75 * Warning: 76 * $(D ptr)'s reference count is not increased by this function! 77 * Adjust reference count before calling it if necessary 78 * 79 * $(RED Only use this if you know what your doing! 80 * This function should not be needed for standard cairoD usage.) 81 */ 82 this(cairo_surface_t* ptr) 83 { 84 super(ptr); 85 } 86 87 /** 88 * Creates a SVG surface of the specified size in points to 89 * be written to filename. 90 * 91 * The SVG surface backend recognizes the following MIME types 92 * for the data attached to a surface 93 * (see $(D Surface.setMimeData())) when it is used as a 94 * source pattern for drawing on this surface: 95 * CAIRO_MIME_TYPE_JPEG, CAIRO_MIME_TYPE_PNG, CAIRO_MIME_TYPE_URI. 96 * If any of them is specified, the SVG backend emits a href 97 * with the content of MIME data instead of a surface 98 * snapshot (PNG, Base64-encoded) in the corresponding image tag. 99 * 100 * The unofficial MIME type CAIRO_MIME_TYPE_URI is examined 101 * first. If present, the URI is emitted as is: assuring the 102 * correctness of URI is left to the client code. 103 * 104 * If CAIRO_MIME_TYPE_URI is not present, but CAIRO_MIME_TYPE_JPEG 105 * or CAIRO_MIME_TYPE_PNG is specified, the corresponding 106 * data is Base64-encoded and emitted. 107 * 108 * Params: 109 * width = width of the surface, in points (1 point == 1/72.0 inch) 110 * height = height of the surface, in points (1 point == 1/72.0 inch) 111 */ 112 this(string fileName, double width, double height) 113 { 114 super(cairo_svg_surface_create(toStringz(fileName), width, height)); 115 } 116 117 /** 118 * Creates a SVG surface of the specified size in points. 119 * This will generate a SVG surface that may be queried and 120 * used as a source, without generating a temporary file. 121 * 122 * The SVG surface backend recognizes the following MIME types 123 * for the data attached to a surface 124 * (see $(D Surface.setMimeData())) when it is used as a 125 * source pattern for drawing on this surface: 126 * CAIRO_MIME_TYPE_JPEG, CAIRO_MIME_TYPE_PNG, CAIRO_MIME_TYPE_URI. 127 * If any of them is specified, the SVG backend emits a href 128 * with the content of MIME data instead of a surface 129 * snapshot (PNG, Base64-encoded) in the corresponding image tag. 130 * 131 * The unofficial MIME type CAIRO_MIME_TYPE_URI is examined 132 * first. If present, the URI is emitted as is: assuring the 133 * correctness of URI is left to the client code. 134 * 135 * If CAIRO_MIME_TYPE_URI is not present, but CAIRO_MIME_TYPE_JPEG 136 * or CAIRO_MIME_TYPE_PNG is specified, the corresponding 137 * data is Base64-encoded and emitted. 138 * 139 * Params: 140 * width = width of the surface, in points (1 point == 1/72.0 inch) 141 * height = height of the surface, in points (1 point == 1/72.0 inch) 142 */ 143 this(double width, double height) 144 { 145 this("", width, height); 146 } 147 148 /** 149 * Restricts the generated SVG file to version. 150 * See $(D getSVGVersions()) for a list of available 151 * version values that can be used here. 152 * 153 * This function should only be called before any 154 * drawing operations have been performed on the given surface. 155 * The simplest way to do this is to call this function 156 * immediately after creating the surface. 157 */ 158 void restrictToVersion(SVGVersion vers) 159 { 160 scope(exit) 161 checkError(); 162 cairo_svg_surface_restrict_to_version(this.nativePointer, vers); 163 } 164 } 165 }