Chromium Code Reviews| Index: src/ports/SkTypeface_win_dw.cpp |
| diff --git a/src/ports/SkTypeface_win_dw.cpp b/src/ports/SkTypeface_win_dw.cpp |
| index 5031060695592be1ffd4f05a04247a06f8409688..2387def0a8998f133a5f84e09f88735482c75bea 100644 |
| --- a/src/ports/SkTypeface_win_dw.cpp |
| +++ b/src/ports/SkTypeface_win_dw.cpp |
| @@ -5,6 +5,13 @@ |
| * found in the LICENSE file. |
| */ |
| +#include "SkTypes.h" |
| +// SkTypes will include Windows.h, which will pull in all of the GDI defines. |
| +// GDI #defines GetGlyphIndices to GetGlyphIndicesA or GetGlyphIndicesW, but |
| +// IDWriteFontFace has a method called GetGlyphIndices. Since this file does |
| +// not use GDI, undefing GetGlyphIndices makes things less confusing. |
| +#undef GetGlyphIndices |
| + |
| #include "SkDWriteFontFileStream.h" |
| #include "SkFontDescriptor.h" |
| #include "SkFontStream.h" |
| @@ -15,7 +22,6 @@ |
| #include "SkScalerContext.h" |
| #include "SkScalerContext_win_dw.h" |
| #include "SkTypeface_win_dw.h" |
| -#include "SkTypes.h" |
| #include "SkUtils.h" |
| void DWriteFontTypeface::onGetFontDescriptor(SkFontDescriptor* desc, |
| @@ -278,9 +284,6 @@ using namespace skia_advanced_typeface_metrics_utils; |
| // Construct Glyph to Unicode table. |
| // Unicode code points that require conjugate pairs in utf16 are not |
| // supported. |
| -// TODO(arthurhsu): Add support for conjugate pairs. It looks like that may |
| -// require parsing the TTF cmap table (platform 4, encoding 12) directly instead |
| -// of calling GetFontUnicodeRange(). |
| // TODO(bungeman): This never does what anyone wants. |
| // What is really wanted is the text to glyphs mapping |
| static void populate_glyph_to_unicode(IDWriteFontFace* fontFace, |
| @@ -289,45 +292,19 @@ static void populate_glyph_to_unicode(IDWriteFontFace* fontFace, |
| HRESULT hr = S_OK; |
| //Do this like free type instead |
| - UINT32 count = 0; |
| - for (UINT32 c = 0; c < 0x10FFFF; ++c) { |
| - UINT16 glyph; |
| - hr = fontFace->GetGlyphIndices(&c, 1, &glyph); |
| - if (glyph > 0) { |
| - ++count; |
| - } |
| - } |
| - |
| - SkAutoTArray<UINT32> chars(count); |
| - count = 0; |
| + SkAutoTMalloc<SkUnichar> glyphToUni(glyphCount); |
| + int maxGlyph = -1; |
| for (UINT32 c = 0; c < 0x10FFFF; ++c) { |
| UINT16 glyph; |
| hr = fontFace->GetGlyphIndices(&c, 1, &glyph); |
| - if (glyph > 0) { |
| - chars[count] = c; |
| - ++count; |
| + SkASSERT(glyph < glyphCount); |
| + if (0 < glyph) { |
| + maxGlyph = SkTMax(static_cast<int>(glyph), maxGlyph); |
| + glyphToUni[glyph] = c; |
| } |
| } |
| - SkAutoTArray<UINT16> glyph(count); |
| - fontFace->GetGlyphIndices(chars.get(), count, glyph.get()); |
| - |
| - USHORT maxGlyph = 0; |
| - for (USHORT j = 0; j < count; ++j) { |
| - if (glyph[j] > maxGlyph) maxGlyph = glyph[j]; |
| - } |
| - |
| - glyphToUnicode->setCount(maxGlyph+1); |
| - for (USHORT j = 0; j < maxGlyph+1u; ++j) { |
| - (*glyphToUnicode)[j] = 0; |
| - } |
| - |
| - //'invert' |
| - for (USHORT j = 0; j < count; ++j) { |
| - if (glyph[j] < glyphCount && (*glyphToUnicode)[glyph[j]] == 0) { |
| - (*glyphToUnicode)[glyph[j]] = chars[j]; |
| - } |
| - } |
| + glyphToUnicode->swap(SkTDArray<SkUnichar>(glyphToUni, maxGlyph + 1)); |
|
Nico
2014/08/25 03:18:59
Our clang/win fyi bot doesn't like this:
..\..\th
bungeman-skia
2014/08/25 14:01:49
Hmmmm, yes, C++ specifically forbids all of this t
|
| } |
| static bool getWidthAdvance(IDWriteFontFace* fontFace, int gId, int16_t* advance) { |