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.ft; 22 23 import cairo.cairo; 24 import cairo.c.cairo; 25 26 static if(CAIRO_HAS_FT_FONT) 27 { 28 import cairo.c.ft; 29 import derelict.freetype.ft; 30 31 /** 32 * Font support for FreeType 33 */ 34 public class FTFontFace : FontFace 35 { 36 public: 37 /** 38 * Create a $(D FTFontFace) from a existing $(D cairo_font_face_t*). 39 * FTFontFace is a garbage collected class. It will call $(D cairo_font_face_destroy) 40 * when it gets collected by the GC or when $(D dispose()) is called. 41 * 42 * Warning: 43 * $(D ptr)'s reference count is not increased by this function! 44 * Adjust reference count before calling it if necessary 45 * 46 * $(RED Only use this if you know what your doing! 47 * This function should not be needed for standard cairoD usage.) 48 */ 49 this(cairo_font_face_t* ptr) 50 { 51 super(ptr); 52 } 53 54 /** 55 * Creates a new font face for the FreeType font backend from 56 * a pre-opened FreeType face. This font can then be 57 * used with $(D Context.setFontFace()) or $(D new ScaledFont()). 58 * The $(D ScaledFont) returned from 59 * $(D new ScaledFont()) is also for 60 * the FreeType backend and can be used with functions such 61 * as $(FTScaledFont.lockFace()). Note that Cairo may 62 * keep a reference to the FT_Face alive in a font-cache 63 * and the exact lifetime of the reference depends highly 64 * upon the exact usage pattern and is subject to external 65 * factors. You must not call FT_Done_Face() before the 66 * $(D FTFontFace) has been disposed / collected. 67 * 68 * TODO: translate example from cairo API docs; 69 * What abou the cairo_font_face_set_user_data part? 70 */ 71 this(FT_Face face, int loadFlags) 72 { 73 super(cairo_ft_font_face_create_for_ft_face(face, loadFlags)); 74 } 75 } 76 77 /** 78 * Font support for FreeType 79 */ 80 public class FTScaledFont : ScaledFont 81 { 82 public: 83 /** 84 * Create a $(D FTScaledFont) from a existing $(D cairo_scaled_font_t*). 85 * FTScaledFont is a garbage collected class. It will call $(D cairo_scaled_font_destroy) 86 * when it gets collected by the GC or when $(D dispose()) is called. 87 * 88 * Warning: 89 * $(D ptr)'s reference count is not increased by this function! 90 * Adjust reference count before calling it if necessary 91 * 92 * $(RED Only use this if you know what your doing! 93 * This function should not be needed for standard cairoD usage.) 94 */ 95 this(cairo_scaled_font_t* ptr) 96 { 97 super(ptr); 98 } 99 100 /** 101 * $(D lockFace()) gets the FT_Face object from a FreeType 102 * backend font and scales it appropriately for the font. 103 * You must release the face with $(D unlockFace()) when you 104 * are done using it. Since the FT_Face object can be shared 105 * between multiple $(D ScaledFont) objects, you must not 106 * lock any other font objects until you unlock this one. 107 * A count is kept of the number of times $(D lockFace()) 108 * is called. $(D unlockFace()) must be called the same number of times. 109 * 110 * You must be careful when using this function in a library 111 * or in a threaded application, because freetype's design 112 * makes it unsafe to call freetype functions simultaneously 113 * from multiple threads, (even if using distinct FT_Face objects). 114 * Because of this, application code that acquires an FT_Face 115 * object with this call must add its own locking to protect 116 * any use of that object, (and which also must protect any 117 * other calls into cairo as almost any cairo function 118 * might result in a call into the freetype library). 119 */ 120 FT_Face lockFace() 121 { 122 auto tmp = cairo_ft_scaled_font_lock_face(this.nativePointer); 123 checkError(); 124 return tmp; 125 } 126 127 /** 128 * Releases a face obtained with $(D lockFace()). 129 */ 130 void unlockFace() 131 { 132 cairo_ft_scaled_font_unlock_face(this.nativePointer); 133 checkError(); 134 return; 135 } 136 } 137 }