GlyphPageTreeNodeDirect2D.cpp [plain text]
#include "config.h"
#include "GlyphPage.h"
#if USE(DIRECT2D)
#include "Font.h"
#include "TextAnalyzerHelper.h"
#include <dwrite.h>
namespace WebCore {
bool GlyphPage::fill(UChar* buffer, unsigned bufferLength)
{
if (bufferLength > GlyphPage::size)
return false;
const Font& font = this->font();
bool haveGlyphs = false;
COMPtr<IDWriteTextAnalyzer> analyzer;
HRESULT hr = Font::systemDWriteFactory()->CreateTextAnalyzer(&analyzer);
RELEASE_ASSERT(SUCCEEDED(hr));
auto& fontPlatformData = font.platformData();
UChar localeName[LOCALE_NAME_MAX_LENGTH + 1] = { };
int localeLength = GetUserDefaultLocaleName(reinterpret_cast<LPWSTR>(&localeName), LOCALE_NAME_MAX_LENGTH);
RELEASE_ASSERT(localeLength <= LOCALE_NAME_MAX_LENGTH);
localeName[localeLength] = '\0';
TextAnalyzerHelper helper(localeName, buffer, bufferLength);
hr = analyzer->AnalyzeScript(&helper, 0, bufferLength, &helper);
RELEASE_ASSERT(SUCCEEDED(hr));
unsigned returnedCount = 0;
Glyph localGlyphBuffer[GlyphPage::size];
Glyph clusterMap[GlyphPage::size];
Vector<DWRITE_SHAPING_TEXT_PROPERTIES> textProperties(GlyphPage::size);
Vector<DWRITE_SHAPING_GLYPH_PROPERTIES> glyphProperties(GlyphPage::size);
hr = analyzer->GetGlyphs(buffer, bufferLength, fontPlatformData.dwFontFace(), fontPlatformData.orientation() == Vertical, false,
&helper.m_analysis, nullptr, nullptr, nullptr, nullptr, 0, GlyphPage::size, clusterMap, textProperties.data(),
localGlyphBuffer, glyphProperties.data(), &returnedCount);
if (!SUCCEEDED(hr))
return false;
for (unsigned i = 0; i < GlyphPage::size; i++) {
Glyph glyph = localGlyphBuffer[i];
if (!glyph)
setGlyphForIndex(i, 0);
else {
setGlyphForIndex(i, glyph);
haveGlyphs = true;
}
}
return haveGlyphs;
}
}
#endif