Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(105)

Unified Diff: Source/platform/fonts/harfbuzz/HarfBuzzShaper.cpp

Issue 130433006: Implement CSS Emphasis Marks for complex text (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: WiP Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/platform/fonts/harfbuzz/HarfBuzzShaper.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/platform/fonts/harfbuzz/HarfBuzzShaper.cpp
diff --git a/Source/platform/fonts/harfbuzz/HarfBuzzShaper.cpp b/Source/platform/fonts/harfbuzz/HarfBuzzShaper.cpp
index 13ac6f80ffa7ef644d2849f29d95ca0854a8bf42..7dc2eda0b8162eafbf6d466cd08158344010d0af 100644
--- a/Source/platform/fonts/harfbuzz/HarfBuzzShaper.cpp
+++ b/Source/platform/fonts/harfbuzz/HarfBuzzShaper.cpp
@@ -348,7 +348,7 @@ static void normalizeCharacters(const TextRun& run, unsigned length, UChar* dest
}
}
-HarfBuzzShaper::HarfBuzzShaper(const Font* font, const TextRun& run)
+HarfBuzzShaper::HarfBuzzShaper(const Font* font, const TextRun& run, bool forTextEmphasis)
: m_font(font)
, m_normalizedBufferLength(0)
, m_run(run)
@@ -359,6 +359,7 @@ HarfBuzzShaper::HarfBuzzShaper(const Font* font, const TextRun& run)
, m_letterSpacing(font->letterSpacing())
, m_fromIndex(0)
, m_toIndex(m_run.length())
+ , m_forTextEmphasis(forTextEmphasis)
{
m_normalizedBuffer = adoptArrayPtr(new UChar[m_run.length() + 1]);
normalizeCharacters(m_run, m_run.length(), m_normalizedBuffer.get(), &m_normalizedBufferLength);
@@ -674,7 +675,7 @@ bool HarfBuzzShaper::shapeHarfBuzzRuns()
const UChar* src = m_normalizedBuffer.get() + currentRun->startIndex();
std::wstring key(src, src + currentRun->numCharacters());
- CachedShapingResults* cachedResults = runCache.find(key);
+ CachedShapingResults* cachedResults = m_forTextEmphasis ? 0 : runCache.find(key);
if (cachedResults) {
if (cachedResults->dir == props.direction && cachedResults->font == *m_font) {
currentRun->applyShapeResult(cachedResults->buffer);
@@ -713,7 +714,8 @@ bool HarfBuzzShaper::shapeHarfBuzzRuns()
currentRun->applyShapeResult(harfBuzzBuffer.get());
setGlyphPositionsForHarfBuzzRun(currentRun, harfBuzzBuffer.get());
- runCache.insert(key, new CachedShapingResults(harfBuzzBuffer.get(), m_font, props.direction));
+ if (!m_forTextEmphasis)
+ runCache.insert(key, new CachedShapingResults(harfBuzzBuffer.get(), m_font, props.direction));
harfBuzzBuffer.set(hb_buffer_create());
hb_buffer_set_unicode_funcs(harfBuzzBuffer.get(), hb_icu_get_unicode_funcs());
@@ -787,16 +789,26 @@ void HarfBuzzShaper::fillGlyphBufferFromHarfBuzzRun(GlyphBuffer* glyphBuffer, Ha
FloatPoint& nextOffset = (i == numGlyphs - 1) ? firstOffsetOfNextRun : offsets[i + 1];
float glyphAdvanceX = advances[i] + nextOffset.x() - currentOffset.x();
float glyphAdvanceY = nextOffset.y() - currentOffset.y();
+
+ Glyph glyphToAdd = glyphs[i];
+ UChar ch = m_run[currentCharacterIndex];
+ if (m_forTextEmphasis)
+ printf("Glyph: 0x%x, Character: 0x%x\n", glyphToAdd, ch);
Dominik Röttsches 2014/01/16 16:37:32 When running this against: http://roettsch.es/emph
+
+ // FIXME: Combining marks should receive a text emphasis mark if they are combine with a space.
+ if (m_forTextEmphasis && (!Font::canReceiveTextEmphasis(ch) || (U_GET_GC_MASK(ch) & U_GC_M_MASK)))
+ glyphToAdd = 0;
+
if (m_run.rtl()) {
if (currentCharacterIndex >= m_toIndex)
m_startOffset.move(glyphAdvanceX, glyphAdvanceY);
else if (currentCharacterIndex >= m_fromIndex)
- glyphBuffer->add(glyphs[i], currentRun->fontData(), createGlyphBufferAdvance(glyphAdvanceX, glyphAdvanceY));
+ glyphBuffer->add(glyphToAdd, currentRun->fontData(), createGlyphBufferAdvance(glyphAdvanceX, glyphAdvanceY));
} else {
if (currentCharacterIndex < m_fromIndex)
m_startOffset.move(glyphAdvanceX, glyphAdvanceY);
else if (currentCharacterIndex < m_toIndex)
- glyphBuffer->add(glyphs[i], currentRun->fontData(), createGlyphBufferAdvance(glyphAdvanceX, glyphAdvanceY));
+ glyphBuffer->add(glyphToAdd, currentRun->fontData(), createGlyphBufferAdvance(glyphAdvanceX, glyphAdvanceY));
}
}
}
« no previous file with comments | « Source/platform/fonts/harfbuzz/HarfBuzzShaper.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698