OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 Google Inc. All rights reserved. | 2 * Copyright (c) 2012 Google Inc. All rights reserved. |
| 3 * Copyright (c) 2014 BlackBerry Limited. All rights reserved. |
3 * | 4 * |
4 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
6 * met: | 7 * met: |
7 * | 8 * |
8 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 11 * * Redistributions in binary form must reproduce the above |
11 * copyright notice, this list of conditions and the following disclaimer | 12 * copyright notice, this list of conditions and the following disclaimer |
12 * in the documentation and/or other materials provided with the | 13 * in the documentation and/or other materials provided with the |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 return advance; | 111 return advance; |
111 } | 112 } |
112 | 113 |
113 static hb_bool_t harfBuzzGetGlyphHorizontalOrigin(hb_font_t* hbFont, void* fontD
ata, hb_codepoint_t glyph, hb_position_t* x, hb_position_t* y, void* userData) | 114 static hb_bool_t harfBuzzGetGlyphHorizontalOrigin(hb_font_t* hbFont, void* fontD
ata, hb_codepoint_t glyph, hb_position_t* x, hb_position_t* y, void* userData) |
114 { | 115 { |
115 // Just return true, following the way that HarfBuzz-FreeType | 116 // Just return true, following the way that HarfBuzz-FreeType |
116 // implementation does. | 117 // implementation does. |
117 return true; | 118 return true; |
118 } | 119 } |
119 | 120 |
| 121 static hb_position_t harfBuzzGetGlyphHorizontalKerning(hb_font_t*, void* fontDat
a, hb_codepoint_t leftGlyph, hb_codepoint_t rightGlyph, void*) |
| 122 { |
| 123 HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData)
; |
| 124 if (hbFontData->m_paint.isVerticalText()) { |
| 125 // We don't support cross-stream kerning |
| 126 return 0; |
| 127 } |
| 128 |
| 129 SkTypeface* typeface = hbFontData->m_paint.getTypeface(); |
| 130 |
| 131 const uint16_t glyphs[2] = { leftGlyph, rightGlyph }; |
| 132 int32_t kerningAdjustments[1] = { 0 }; |
| 133 |
| 134 if (typeface->getKerningPairAdjustments(glyphs, 2, kerningAdjustments)) { |
| 135 SkScalar upm = SkIntToScalar(typeface->getUnitsPerEm()); |
| 136 SkScalar size = hbFontData->m_paint.getTextSize(); |
| 137 return SkiaScalarToHarfBuzzPosition(SkScalarMulDiv(SkIntToScalar(kerning
Adjustments[0]), size, upm)); |
| 138 } |
| 139 |
| 140 return 0; |
| 141 } |
| 142 |
| 143 static hb_position_t harfBuzzGetGlyphVerticalKerning(hb_font_t*, void* fontData,
hb_codepoint_t topGlyph, hb_codepoint_t bottomGlyph, void*) |
| 144 { |
| 145 HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData)
; |
| 146 if (!hbFontData->m_paint.isVerticalText()) { |
| 147 // We don't support cross-stream kerning |
| 148 return 0; |
| 149 } |
| 150 |
| 151 SkTypeface* typeface = hbFontData->m_paint.getTypeface(); |
| 152 |
| 153 const uint16_t glyphs[2] = { topGlyph, bottomGlyph }; |
| 154 int32_t kerningAdjustments[1] = { 0 }; |
| 155 |
| 156 if (typeface->getKerningPairAdjustments(glyphs, 2, kerningAdjustments)) { |
| 157 SkScalar upm = SkIntToScalar(typeface->getUnitsPerEm()); |
| 158 SkScalar size = hbFontData->m_paint.getTextSize(); |
| 159 return SkiaScalarToHarfBuzzPosition(SkScalarMulDiv(SkIntToScalar(kerning
Adjustments[0]), size, upm)); |
| 160 } |
| 161 |
| 162 return 0; |
| 163 } |
| 164 |
120 static hb_bool_t harfBuzzGetGlyphExtents(hb_font_t* hbFont, void* fontData, hb_c
odepoint_t glyph, hb_glyph_extents_t* extents, void* userData) | 165 static hb_bool_t harfBuzzGetGlyphExtents(hb_font_t* hbFont, void* fontData, hb_c
odepoint_t glyph, hb_glyph_extents_t* extents, void* userData) |
121 { | 166 { |
122 HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData)
; | 167 HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData)
; |
123 | 168 |
124 SkiaGetGlyphWidthAndExtents(&hbFontData->m_paint, glyph, 0, extents); | 169 SkiaGetGlyphWidthAndExtents(&hbFontData->m_paint, glyph, 0, extents); |
125 return true; | 170 return true; |
126 } | 171 } |
127 | 172 |
128 static hb_font_funcs_t* harfBuzzSkiaGetFontFuncs() | 173 static hb_font_funcs_t* harfBuzzSkiaGetFontFuncs() |
129 { | 174 { |
130 static hb_font_funcs_t* harfBuzzSkiaFontFuncs = 0; | 175 static hb_font_funcs_t* harfBuzzSkiaFontFuncs = 0; |
131 | 176 |
132 // We don't set callback functions which we can't support. | 177 // We don't set callback functions which we can't support. |
133 // HarfBuzz will use the fallback implementation if they aren't set. | 178 // HarfBuzz will use the fallback implementation if they aren't set. |
134 if (!harfBuzzSkiaFontFuncs) { | 179 if (!harfBuzzSkiaFontFuncs) { |
135 harfBuzzSkiaFontFuncs = hb_font_funcs_create(); | 180 harfBuzzSkiaFontFuncs = hb_font_funcs_create(); |
136 hb_font_funcs_set_glyph_func(harfBuzzSkiaFontFuncs, harfBuzzGetGlyph, 0,
0); | 181 hb_font_funcs_set_glyph_func(harfBuzzSkiaFontFuncs, harfBuzzGetGlyph, 0,
0); |
137 hb_font_funcs_set_glyph_h_advance_func(harfBuzzSkiaFontFuncs, harfBuzzGe
tGlyphHorizontalAdvance, 0, 0); | 182 hb_font_funcs_set_glyph_h_advance_func(harfBuzzSkiaFontFuncs, harfBuzzGe
tGlyphHorizontalAdvance, 0, 0); |
| 183 hb_font_funcs_set_glyph_h_kerning_func(harfBuzzSkiaFontFuncs, harfBuzzGe
tGlyphHorizontalKerning, 0, 0); |
138 hb_font_funcs_set_glyph_h_origin_func(harfBuzzSkiaFontFuncs, harfBuzzGet
GlyphHorizontalOrigin, 0, 0); | 184 hb_font_funcs_set_glyph_h_origin_func(harfBuzzSkiaFontFuncs, harfBuzzGet
GlyphHorizontalOrigin, 0, 0); |
| 185 hb_font_funcs_set_glyph_v_kerning_func(harfBuzzSkiaFontFuncs, harfBuzzGe
tGlyphVerticalKerning, 0, 0); |
139 hb_font_funcs_set_glyph_extents_func(harfBuzzSkiaFontFuncs, harfBuzzGetG
lyphExtents, 0, 0); | 186 hb_font_funcs_set_glyph_extents_func(harfBuzzSkiaFontFuncs, harfBuzzGetG
lyphExtents, 0, 0); |
140 hb_font_funcs_make_immutable(harfBuzzSkiaFontFuncs); | 187 hb_font_funcs_make_immutable(harfBuzzSkiaFontFuncs); |
141 } | 188 } |
142 return harfBuzzSkiaFontFuncs; | 189 return harfBuzzSkiaFontFuncs; |
143 } | 190 } |
144 | 191 |
145 static hb_blob_t* harfBuzzSkiaGetTable(hb_face_t* face, hb_tag_t tag, void* user
Data) | 192 static hb_blob_t* harfBuzzSkiaGetTable(hb_face_t* face, hb_tag_t tag, void* user
Data) |
146 { | 193 { |
147 SkTypeface* typeface = reinterpret_cast<SkTypeface*>(userData); | 194 SkTypeface* typeface = reinterpret_cast<SkTypeface*>(userData); |
148 | 195 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 hb_font_make_immutable(font); | 234 hb_font_make_immutable(font); |
188 return font; | 235 return font; |
189 } | 236 } |
190 | 237 |
191 GlyphBufferAdvance HarfBuzzShaper::createGlyphBufferAdvance(float width, float h
eight) | 238 GlyphBufferAdvance HarfBuzzShaper::createGlyphBufferAdvance(float width, float h
eight) |
192 { | 239 { |
193 return GlyphBufferAdvance(width, height); | 240 return GlyphBufferAdvance(width, height); |
194 } | 241 } |
195 | 242 |
196 } // namespace WebCore | 243 } // namespace WebCore |
OLD | NEW |