1 /* 2 * Copyright (c) 2006, 2007, 2008, Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #ifndef FontPlatformDataHarfBuzz_h 32 #define FontPlatformDataHarfBuzz_h 33 34 #include "SkPaint.h" 35 #include "platform/SharedBuffer.h" 36 #include "platform/fonts/FontDescription.h" 37 #include "platform/fonts/FontOrientation.h" 38 #include "platform/fonts/FontRenderStyle.h" 39 #include "platform/fonts/opentype/OpenTypeVerticalData.h" 40 #include "wtf/Forward.h" 41 #include "wtf/HashTableDeletedValueType.h" 42 #include "wtf/RefPtr.h" 43 #include "wtf/text/CString.h" 44 #include "wtf/text/StringImpl.h" 45 46 class SkTypeface; 47 typedef uint32_t SkFontID; 48 49 namespace WebCore { 50 51 class GraphicsContext; 52 class HarfBuzzFace; 53 54 // ----------------------------------------------------------------------------- 55 // FontPlatformData is the handle which WebKit has on a specific face. A face 56 // is the tuple of (font, size, ...etc). Here we are just wrapping a Skia 57 // SkTypeface pointer and dealing with the reference counting etc. 58 // ----------------------------------------------------------------------------- 59 class PLATFORM_EXPORT FontPlatformData { 60 public: 61 // Used for deleted values in the font cache's hash tables. The hash table 62 // will create us with this structure, and it will compare other values 63 // to this "Deleted" one. It expects the Deleted one to be differentiable 64 // from the 0 one (created with the empty constructor), so we can't just 65 // set everything to 0. 66 FontPlatformData(WTF::HashTableDeletedValueType); 67 FontPlatformData(); 68 FontPlatformData(float textSize, bool fakeBold, bool fakeItalic); 69 FontPlatformData(const FontPlatformData&); 70 FontPlatformData(PassRefPtr<SkTypeface>, const char* name, float textSize, bool fakeBold, bool fakeItalic, FontOrientation = Horizontal, bool subpixelTextPosition = FontDescription::subpixelPositioning()); 71 FontPlatformData(const FontPlatformData& src, float textSize); 72 ~FontPlatformData(); 73 74 String fontFamilyName() const; 75 76 // ------------------------------------------------------------------------- 77 // Return true iff this font is monospaced (i.e. every glyph has an equal x 78 // advance) 79 // ------------------------------------------------------------------------- 80 bool isFixedPitch() const; 81 82 // ------------------------------------------------------------------------- 83 // Setup a Skia painting context to use this font. 84 // ------------------------------------------------------------------------- 85 void setupPaint(SkPaint*, GraphicsContext* = 0) const; 86 87 // ------------------------------------------------------------------------- 88 // Return Skia's unique id for this font. This encodes both the style and 89 // the font's file name so refers to a single face. 90 // ------------------------------------------------------------------------- 91 SkFontID uniqueID() const; 92 SkTypeface* typeface() const { return m_typeface.get(); } 93 94 unsigned hash() const; 95 float size() const { return m_textSize; } 96 int emSizeInFontUnits() const; 97 98 FontOrientation orientation() const { return m_orientation; } 99 void setOrientation(FontOrientation orientation) { m_orientation = orientation; } 100 void setFakeBold(bool fakeBold) { m_fakeBold = fakeBold; } 101 void setFakeItalic(bool fakeItalic) { m_fakeItalic = fakeItalic; } 102 bool operator==(const FontPlatformData&) const; 103 FontPlatformData& operator=(const FontPlatformData&); 104 bool isHashTableDeletedValue() const { return m_isHashTableDeletedValue; } 105 106 #if ENABLE(OPENTYPE_VERTICAL) 107 PassRefPtr<OpenTypeVerticalData> verticalData() const; 108 PassRefPtr<SharedBuffer> openTypeTable(uint32_t table) const; 109 #endif 110 111 #ifndef NDEBUG 112 String description() const; 113 #endif 114 115 HarfBuzzFace* harfBuzzFace() const; 116 117 // The returned styles are all actual styles without FontRenderStyle::NoPreference. 118 const FontRenderStyle& fontRenderStyle() const { return m_style; } 119 120 // ------------------------------------------------------------------------- 121 // Global font preferences... 122 123 static void setHinting(SkPaint::Hinting); 124 static void setAutoHint(bool); 125 static void setUseBitmaps(bool); 126 static void setAntiAlias(bool); 127 static void setSubpixelRendering(bool); 128 129 private: 130 void getRenderStyleForStrike(const char*, int); 131 void querySystemForRenderStyle(bool useSkiaSubpixelPositioning); 132 133 RefPtr<SkTypeface> m_typeface; 134 CString m_family; 135 float m_textSize; 136 mutable int m_emSizeInFontUnits; 137 bool m_fakeBold; 138 bool m_fakeItalic; 139 FontOrientation m_orientation; 140 FontRenderStyle m_style; 141 mutable RefPtr<HarfBuzzFace> m_harfBuzzFace; 142 bool m_isHashTableDeletedValue; 143 }; 144 145 } // namespace WebCore 146 147 #endif // ifdef FontPlatformDataHarfBuzz_h 148