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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
43 #include <hb-ot.h> | 43 #include <hb-ot.h> |
44 #include <hb.h> | 44 #include <hb.h> |
45 #if OS(MACOSX) | 45 #if OS(MACOSX) |
46 #include <hb-coretext.h> | 46 #include <hb-coretext.h> |
47 #endif | 47 #endif |
48 | 48 |
49 #include <SkPaint.h> | 49 #include <SkPaint.h> |
50 #include <SkPath.h> | 50 #include <SkPath.h> |
51 #include <SkPoint.h> | 51 #include <SkPoint.h> |
52 #include <SkRect.h> | 52 #include <SkRect.h> |
53 #include <SkStream.h> | |
53 #include <SkTypeface.h> | 54 #include <SkTypeface.h> |
54 | 55 |
55 | 56 |
56 namespace blink { | 57 namespace blink { |
57 | 58 |
58 struct HbFontDeleter { | 59 struct HbFontDeleter { |
59 void operator()(hb_font_t* font) | 60 void operator()(hb_font_t* font) |
60 { | 61 { |
61 if (font) | 62 if (font) |
62 hb_font_destroy(font); | 63 hb_font_destroy(font); |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
304 return nullptr; | 305 return nullptr; |
305 size_t actualSize = typeface->getTableData(tag, 0, tableSize, buffer); | 306 size_t actualSize = typeface->getTableData(tag, 0, tableSize, buffer); |
306 if (tableSize != actualSize) { | 307 if (tableSize != actualSize) { |
307 WTF::Partitions::fastFree(buffer); | 308 WTF::Partitions::fastFree(buffer); |
308 return nullptr; | 309 return nullptr; |
309 } | 310 } |
310 return hb_blob_create(const_cast<char*>(buffer), tableSize, HB_MEMORY_MODE_W RITABLE, buffer, WTF::Partitions::fastFree); | 311 return hb_blob_create(const_cast<char*>(buffer), tableSize, HB_MEMORY_MODE_W RITABLE, buffer, WTF::Partitions::fastFree); |
311 } | 312 } |
312 #endif | 313 #endif |
313 | 314 |
315 #if !OS(MACOSX) | |
316 static void deleteTypefaceStream(void* streamAssetPtr) | |
317 { | |
318 SkStreamAsset* streamAsset = reinterpret_cast<SkStreamAsset*>(streamAssetPtr ); | |
319 delete streamAsset; | |
320 } | |
321 #endif | |
322 | |
314 hb_face_t* HarfBuzzFace::createFace() | 323 hb_face_t* HarfBuzzFace::createFace() |
315 { | 324 { |
316 #if OS(MACOSX) | 325 #if OS(MACOSX) |
317 hb_face_t* face = hb_coretext_face_create(m_platformData->cgFont()); | 326 hb_face_t* face = hb_coretext_face_create(m_platformData->cgFont()); |
318 #else | 327 #else |
319 hb_face_t* face = hb_face_create_for_tables(harfBuzzSkiaGetTable, m_platform Data->typeface(), 0); | 328 hb_face_t* face = nullptr; |
329 | |
330 SkTypeface* typeface = m_platformData->typeface(); | |
331 SkStreamAsset* typefaceStream = typeface->openStream(0); | |
332 if (typefaceStream->getMemoryBase()) { | |
333 std::unique_ptr<hb_blob_t, void(*)(hb_blob_t*)> faceBlob(hb_blob_create( | |
334 reinterpret_cast<const char*>(typefaceStream->getMemoryBase()), | |
335 typefaceStream->getLength(), | |
336 HB_MEMORY_MODE_READONLY, | |
337 typefaceStream, | |
338 deleteTypefaceStream), | |
339 hb_blob_destroy); | |
340 face = hb_face_create(faceBlob.get(), 0); | |
behdad
2016/06/23 13:27:36
Instead of 0, you need the TTC index of the face.
| |
341 } | |
342 | |
343 // Fallback to table copies if there is no in-memory access. | |
344 if (!face) | |
345 face = hb_face_create_for_tables(harfBuzzSkiaGetTable, m_platformData->t ypeface(), 0); | |
320 #endif | 346 #endif |
321 ASSERT(face); | 347 ASSERT(face); |
322 return face; | 348 return face; |
323 } | 349 } |
324 | 350 |
325 PassRefPtr<HbFontCacheEntry> createHbFontCacheEntry(hb_face_t* face) | 351 PassRefPtr<HbFontCacheEntry> createHbFontCacheEntry(hb_face_t* face) |
326 { | 352 { |
327 HbFontUniquePtr otFont(hb_font_create(face)); | 353 HbFontUniquePtr otFont(hb_font_create(face)); |
328 hb_ot_font_set_funcs(otFont.get()); | 354 hb_ot_font_set_funcs(otFont.get()); |
329 // Creating a sub font means that non-available functions | 355 // Creating a sub font means that non-available functions |
330 // are found from the parent. | 356 // are found from the parent. |
331 hb_font_t* unscaledFont = hb_font_create_sub_font(otFont.get()); | 357 hb_font_t* unscaledFont = hb_font_create_sub_font(otFont.get()); |
332 RefPtr<HbFontCacheEntry> cacheEntry = HbFontCacheEntry::create(unscaledFont) ; | 358 RefPtr<HbFontCacheEntry> cacheEntry = HbFontCacheEntry::create(unscaledFont) ; |
333 hb_font_set_funcs(unscaledFont, harfBuzzSkiaGetFontFuncs(), cacheEntry->hbFo ntData(), nullptr); | 359 hb_font_set_funcs(unscaledFont, harfBuzzSkiaGetFontFuncs(), cacheEntry->hbFo ntData(), nullptr); |
334 return cacheEntry; | 360 return cacheEntry; |
335 } | 361 } |
336 | 362 |
337 hb_font_t* HarfBuzzFace::getScaledFont(PassRefPtr<UnicodeRangeSet> rangeSet) con st | 363 hb_font_t* HarfBuzzFace::getScaledFont(PassRefPtr<UnicodeRangeSet> rangeSet) con st |
338 { | 364 { |
339 m_platformData->setupPaint(&m_harfBuzzFontData->m_paint); | 365 m_platformData->setupPaint(&m_harfBuzzFontData->m_paint); |
340 m_harfBuzzFontData->m_rangeSet = rangeSet; | 366 m_harfBuzzFontData->m_rangeSet = rangeSet; |
341 m_harfBuzzFontData->m_simpleFontData = FontCache::fontCache()->fontDataFromF ontPlatformData(m_platformData).get(); | 367 m_harfBuzzFontData->m_simpleFontData = FontCache::fontCache()->fontDataFromF ontPlatformData(m_platformData).get(); |
342 ASSERT(m_harfBuzzFontData->m_simpleFontData); | 368 ASSERT(m_harfBuzzFontData->m_simpleFontData); |
343 int scale = SkiaScalarToHarfBuzzPosition(m_platformData->size()); | 369 int scale = SkiaScalarToHarfBuzzPosition(m_platformData->size()); |
344 hb_font_set_scale(m_unscaledFont, scale, scale); | 370 hb_font_set_scale(m_unscaledFont, scale, scale); |
345 return m_unscaledFont; | 371 return m_unscaledFont; |
346 } | 372 } |
347 | 373 |
348 } // namespace blink | 374 } // namespace blink |
OLD | NEW |