OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 Google Inc. All rights reserved. | 2 * Copyright (c) 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 | 98 |
99 static hb_position_t getGlyphHorizontalAdvance(hb_font_t* hbFont, void* fontData
, hb_codepoint_t glyph, void* userData) | 99 static hb_position_t getGlyphHorizontalAdvance(hb_font_t* hbFont, void* fontData
, hb_codepoint_t glyph, void* userData) |
100 { | 100 { |
101 CGSize advance; | 101 CGSize advance; |
102 FontPlatformData* platformData = reinterpret_cast<FontPlatformData*>(fontDat
a); | 102 FontPlatformData* platformData = reinterpret_cast<FontPlatformData*>(fontDat
a); |
103 advanceForGlyph(glyph, *platformData, &advance); | 103 advanceForGlyph(glyph, *platformData, &advance); |
104 float syntheticBoldOffset = platformData->m_syntheticBold ? 1.0f : 0.0f; | 104 float syntheticBoldOffset = platformData->m_syntheticBold ? 1.0f : 0.0f; |
105 return floatToHarfBuzzPosition(advance.width + syntheticBoldOffset); | 105 return floatToHarfBuzzPosition(advance.width + syntheticBoldOffset); |
106 } | 106 } |
107 | 107 |
| 108 static hb_bool_t harfBuzzGetGlyphVerticalOrigin(hb_font_t* hbFont, void* fontDat
a, hb_codepoint_t glyph, hb_position_t* x, hb_position_t* y, void* userData) |
| 109 { |
| 110 FontPlatformData* fontPlatformData = reinterpret_cast<FontPlatformData*>(fon
tData); |
| 111 |
| 112 OpenTypeVerticalData* verticalData = fontPlatformData->verticalData().get(); |
| 113 if (!verticalData) |
| 114 return false; |
| 115 |
| 116 // FIXME: This should be using the existing SimpleFontData or SkFontMetrics. |
| 117 RefPtr<SimpleFontData> simpleFontData = SimpleFontData::create(*fontPlatform
Data); |
| 118 float result[] = { 0, 0 }; |
| 119 |
| 120 Glyph theGlyph = glyph; |
| 121 verticalData->getVerticalTranslationsForGlyphs(simpleFontData.get(), &theGly
ph, 1, result); |
| 122 *x = floatToHarfBuzzPosition(-result[0]); |
| 123 *y = floatToHarfBuzzPosition(-result[1]); |
| 124 |
| 125 return true; |
| 126 } |
| 127 |
| 128 static hb_position_t harfBuzzGetGlyphVerticalAdvance(hb_font_t* hbFont, void* fo
ntData, hb_codepoint_t glyph, void* userData) |
| 129 { |
| 130 FontPlatformData* fontPlatformData = reinterpret_cast<FontPlatformData*>(fon
tData); |
| 131 |
| 132 RefPtr<SimpleFontData> simpleFontData = SimpleFontData::create(*fontPlatform
Data); |
| 133 OpenTypeVerticalData* verticalData = fontPlatformData->verticalData().get(); |
| 134 |
| 135 if (!verticalData) |
| 136 return floatToHarfBuzzPosition(simpleFontData->fontMetrics().height()); |
| 137 |
| 138 // FIXME: This should be using the existing SimpleFontData or SkFontMetrics. |
| 139 Glyph theGlyph = glyph; |
| 140 float advanceHeight = verticalData->advanceHeight(simpleFontData.get(), theG
lyph); |
| 141 |
| 142 return floatToHarfBuzzPosition(advanceHeight); |
| 143 } |
| 144 |
108 static hb_bool_t getGlyphHorizontalOrigin(hb_font_t* hbFont, void* fontData, hb_
codepoint_t glyph, hb_position_t* x, hb_position_t* y, void* userData) | 145 static hb_bool_t getGlyphHorizontalOrigin(hb_font_t* hbFont, void* fontData, hb_
codepoint_t glyph, hb_position_t* x, hb_position_t* y, void* userData) |
109 { | 146 { |
110 return true; | 147 return true; |
111 } | 148 } |
112 | 149 |
113 static hb_bool_t getGlyphExtents(hb_font_t* hbFont, void* fontData, hb_codepoint
_t glyph, hb_glyph_extents_t* extents, void* userData) | 150 static hb_bool_t getGlyphExtents(hb_font_t* hbFont, void* fontData, hb_codepoint
_t glyph, hb_glyph_extents_t* extents, void* userData) |
114 { | 151 { |
115 CTFontRef ctFont = reinterpret_cast<FontPlatformData*>(fontData)->ctFont(); | 152 CTFontRef ctFont = reinterpret_cast<FontPlatformData*>(fontData)->ctFont(); |
116 CGRect cgRect; | 153 CGRect cgRect; |
117 CGGlyph cgGlyph = glyph; | 154 CGGlyph cgGlyph = glyph; |
118 if (CTFontGetBoundingRectsForGlyphs(ctFont, kCTFontDefaultOrientation, &cgGl
yph, &cgRect, 1) == CGRectNull) | 155 if (CTFontGetBoundingRectsForGlyphs(ctFont, kCTFontDefaultOrientation, &cgGl
yph, &cgRect, 1) == CGRectNull) |
119 return false; | 156 return false; |
120 extents->x_bearing = floatToHarfBuzzPosition(cgRect.origin.x); | 157 extents->x_bearing = floatToHarfBuzzPosition(cgRect.origin.x); |
121 extents->y_bearing = -floatToHarfBuzzPosition(cgRect.origin.y); | 158 extents->y_bearing = -floatToHarfBuzzPosition(cgRect.origin.y); |
122 extents->width = floatToHarfBuzzPosition(cgRect.size.width); | 159 extents->width = floatToHarfBuzzPosition(cgRect.size.width); |
123 extents->height = floatToHarfBuzzPosition(cgRect.size.height); | 160 extents->height = floatToHarfBuzzPosition(cgRect.size.height); |
124 return true; | 161 return true; |
125 } | 162 } |
126 | 163 |
127 static hb_font_funcs_t* harfBuzzCoreTextGetFontFuncs() | 164 static hb_font_funcs_t* harfBuzzCoreTextGetFontFuncs() |
128 { | 165 { |
129 static hb_font_funcs_t* harfBuzzCoreTextFontFuncs = 0; | 166 static hb_font_funcs_t* harfBuzzCoreTextFontFuncs = 0; |
130 | 167 |
131 if (!harfBuzzCoreTextFontFuncs) { | 168 if (!harfBuzzCoreTextFontFuncs) { |
132 harfBuzzCoreTextFontFuncs = hb_font_funcs_create(); | 169 harfBuzzCoreTextFontFuncs = hb_font_funcs_create(); |
133 hb_font_funcs_set_glyph_func(harfBuzzCoreTextFontFuncs, getGlyph, 0, 0); | 170 hb_font_funcs_set_glyph_func(harfBuzzCoreTextFontFuncs, getGlyph, 0, 0); |
134 hb_font_funcs_set_glyph_h_advance_func(harfBuzzCoreTextFontFuncs, getGly
phHorizontalAdvance, 0, 0); | 171 hb_font_funcs_set_glyph_h_advance_func(harfBuzzCoreTextFontFuncs, getGly
phHorizontalAdvance, 0, 0); |
135 hb_font_funcs_set_glyph_h_origin_func(harfBuzzCoreTextFontFuncs, getGlyp
hHorizontalOrigin, 0, 0); | 172 hb_font_funcs_set_glyph_h_origin_func(harfBuzzCoreTextFontFuncs, getGlyp
hHorizontalOrigin, 0, 0); |
| 173 hb_font_funcs_set_glyph_v_advance_func(harfBuzzCoreTextFontFuncs, harfBu
zzGetGlyphVerticalAdvance, 0, 0); |
| 174 hb_font_funcs_set_glyph_v_origin_func(harfBuzzCoreTextFontFuncs, harfBuz
zGetGlyphVerticalOrigin, 0, 0); |
136 hb_font_funcs_set_glyph_extents_func(harfBuzzCoreTextFontFuncs, getGlyph
Extents, 0, 0); | 175 hb_font_funcs_set_glyph_extents_func(harfBuzzCoreTextFontFuncs, getGlyph
Extents, 0, 0); |
137 hb_font_funcs_make_immutable(harfBuzzCoreTextFontFuncs); | 176 hb_font_funcs_make_immutable(harfBuzzCoreTextFontFuncs); |
138 } | 177 } |
139 return harfBuzzCoreTextFontFuncs; | 178 return harfBuzzCoreTextFontFuncs; |
140 } | 179 } |
141 | 180 |
142 hb_face_t* HarfBuzzFace::createFace() | 181 hb_face_t* HarfBuzzFace::createFace() |
143 { | 182 { |
144 hb_face_t* face = hb_coretext_face_create(m_platformData->cgFont()); | 183 hb_face_t* face = hb_coretext_face_create(m_platformData->cgFont()); |
145 ASSERT(face); | 184 ASSERT(face); |
146 return face; | 185 return face; |
147 } | 186 } |
148 | 187 |
149 hb_font_t* HarfBuzzFace::createFont() | 188 hb_font_t* HarfBuzzFace::createFont() |
150 { | 189 { |
151 hb_font_t* font = hb_font_create(m_face); | 190 hb_font_t* font = hb_font_create(m_face); |
152 hb_font_set_funcs(font, harfBuzzCoreTextGetFontFuncs(), m_platformData, 0); | 191 hb_font_set_funcs(font, harfBuzzCoreTextGetFontFuncs(), m_platformData, 0); |
153 const float size = m_platformData->m_textSize; | 192 const float size = m_platformData->m_textSize; |
154 hb_font_set_ppem(font, size, size); | 193 hb_font_set_ppem(font, size, size); |
155 const int scale = (1 << 16) * static_cast<int>(size); | 194 const int scale = (1 << 16) * static_cast<int>(size); |
156 hb_font_set_scale(font, scale, scale); | 195 hb_font_set_scale(font, scale, scale); |
157 hb_font_make_immutable(font); | 196 hb_font_make_immutable(font); |
158 return font; | 197 return font; |
159 } | 198 } |
160 | 199 |
161 } // namespace blink | 200 } // namespace blink |
OLD | NEW |