| Index: Source/platform/fonts/harfbuzz/HarfBuzzShaper.cpp
|
| diff --git a/Source/platform/fonts/harfbuzz/HarfBuzzShaper.cpp b/Source/platform/fonts/harfbuzz/HarfBuzzShaper.cpp
|
| index 10abf5082fc7759397880cb6558c57d7499d309f..02cebb26dec6bb583eb6e8656594284d01964234 100644
|
| --- a/Source/platform/fonts/harfbuzz/HarfBuzzShaper.cpp
|
| +++ b/Source/platform/fonts/harfbuzz/HarfBuzzShaper.cpp
|
| @@ -78,138 +78,6 @@ private:
|
| DestroyFunction m_destroy;
|
| };
|
|
|
| -
|
| -static const unsigned cHarfBuzzCacheMaxSize = 256;
|
| -
|
| -struct CachedShapingResultsLRUNode;
|
| -struct CachedShapingResults;
|
| -typedef std::map<std::wstring, CachedShapingResults*> CachedShapingResultsMap;
|
| -typedef std::list<CachedShapingResultsLRUNode*> CachedShapingResultsLRU;
|
| -
|
| -struct CachedShapingResults {
|
| - CachedShapingResults(hb_buffer_t* harfBuzzBuffer, const Font* runFont, hb_direction_t runDir, const String& newLocale);
|
| - ~CachedShapingResults();
|
| -
|
| - hb_buffer_t* buffer;
|
| - Font font;
|
| - hb_direction_t dir;
|
| - String locale;
|
| - CachedShapingResultsLRU::iterator lru;
|
| -};
|
| -
|
| -struct CachedShapingResultsLRUNode {
|
| - CachedShapingResultsLRUNode(const CachedShapingResultsMap::iterator& cacheEntry);
|
| - ~CachedShapingResultsLRUNode();
|
| -
|
| - CachedShapingResultsMap::iterator entry;
|
| -};
|
| -
|
| -CachedShapingResults::CachedShapingResults(hb_buffer_t* harfBuzzBuffer, const Font* fontData, hb_direction_t dirData, const String& newLocale)
|
| - : buffer(harfBuzzBuffer)
|
| - , font(*fontData)
|
| - , dir(dirData)
|
| - , locale(newLocale)
|
| -{
|
| -}
|
| -
|
| -CachedShapingResults::~CachedShapingResults()
|
| -{
|
| - hb_buffer_destroy(buffer);
|
| -}
|
| -
|
| -CachedShapingResultsLRUNode::CachedShapingResultsLRUNode(const CachedShapingResultsMap::iterator& cacheEntry)
|
| - : entry(cacheEntry)
|
| -{
|
| -}
|
| -
|
| -CachedShapingResultsLRUNode::~CachedShapingResultsLRUNode()
|
| -{
|
| -}
|
| -
|
| -class HarfBuzzRunCache {
|
| -public:
|
| - HarfBuzzRunCache();
|
| - ~HarfBuzzRunCache();
|
| -
|
| - CachedShapingResults* find(const std::wstring& key) const;
|
| - void remove(CachedShapingResults* node);
|
| - void moveToBack(CachedShapingResults* node);
|
| - bool insert(const std::wstring& key, CachedShapingResults* run);
|
| -
|
| -private:
|
| - CachedShapingResultsMap m_harfBuzzRunMap;
|
| - CachedShapingResultsLRU m_harfBuzzRunLRU;
|
| -};
|
| -
|
| -
|
| -HarfBuzzRunCache::HarfBuzzRunCache()
|
| -{
|
| -}
|
| -
|
| -HarfBuzzRunCache::~HarfBuzzRunCache()
|
| -{
|
| - for (CachedShapingResultsMap::iterator it = m_harfBuzzRunMap.begin(); it != m_harfBuzzRunMap.end(); ++it)
|
| - delete it->second;
|
| - for (CachedShapingResultsLRU::iterator it = m_harfBuzzRunLRU.begin(); it != m_harfBuzzRunLRU.end(); ++it)
|
| - delete *it;
|
| -}
|
| -
|
| -bool HarfBuzzRunCache::insert(const std::wstring& key, CachedShapingResults* data)
|
| -{
|
| - std::pair<CachedShapingResultsMap::iterator, bool> results =
|
| - m_harfBuzzRunMap.insert(CachedShapingResultsMap::value_type(key, data));
|
| -
|
| - if (!results.second)
|
| - return false;
|
| -
|
| - CachedShapingResultsLRUNode* node = new CachedShapingResultsLRUNode(results.first);
|
| -
|
| - m_harfBuzzRunLRU.push_back(node);
|
| - data->lru = --m_harfBuzzRunLRU.end();
|
| -
|
| - if (m_harfBuzzRunMap.size() > cHarfBuzzCacheMaxSize) {
|
| - CachedShapingResultsLRUNode* lru = m_harfBuzzRunLRU.front();
|
| - CachedShapingResults* foo = lru->entry->second;
|
| - m_harfBuzzRunMap.erase(lru->entry);
|
| - m_harfBuzzRunLRU.pop_front();
|
| - delete foo;
|
| - delete lru;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -inline CachedShapingResults* HarfBuzzRunCache::find(const std::wstring& key) const
|
| -{
|
| - CachedShapingResultsMap::const_iterator it = m_harfBuzzRunMap.find(key);
|
| -
|
| - return it != m_harfBuzzRunMap.end() ? it->second : 0;
|
| -}
|
| -
|
| -inline void HarfBuzzRunCache::remove(CachedShapingResults* node)
|
| -{
|
| - CachedShapingResultsLRUNode* lruNode = *node->lru;
|
| -
|
| - m_harfBuzzRunLRU.erase(node->lru);
|
| - m_harfBuzzRunMap.erase(lruNode->entry);
|
| - delete lruNode;
|
| - delete node;
|
| -}
|
| -
|
| -inline void HarfBuzzRunCache::moveToBack(CachedShapingResults* node)
|
| -{
|
| - CachedShapingResultsLRUNode* lruNode = *node->lru;
|
| - m_harfBuzzRunLRU.erase(node->lru);
|
| - m_harfBuzzRunLRU.push_back(lruNode);
|
| - node->lru = --m_harfBuzzRunLRU.end();
|
| -}
|
| -
|
| -HarfBuzzRunCache& harfBuzzRunCache()
|
| -{
|
| - DEFINE_STATIC_LOCAL(HarfBuzzRunCache, globalHarfBuzzRunCache, ());
|
| - return globalHarfBuzzRunCache;
|
| -}
|
| -
|
| static inline float harfBuzzPositionToFloat(hb_position_t value)
|
| {
|
| return static_cast<float>(value) / (1 << 16);
|
| @@ -812,7 +680,6 @@ bool HarfBuzzShaper::shapeHarfBuzzRuns()
|
| {
|
| HarfBuzzScopedPtr<hb_buffer_t> harfBuzzBuffer(hb_buffer_create(), hb_buffer_destroy);
|
|
|
| - HarfBuzzRunCache& runCache = harfBuzzRunCache();
|
| const FontDescription& fontDescription = m_font->fontDescription();
|
| const String& localeString = fontDescription.locale();
|
| CString locale = localeString.latin1();
|
| @@ -839,22 +706,6 @@ bool HarfBuzzShaper::shapeHarfBuzzRuns()
|
| const UChar* src = m_normalizedBuffer.get() + currentRun->startIndex();
|
| std::wstring key(src, src + currentRun->numCharacters());
|
|
|
| - CachedShapingResults* cachedResults = runCache.find(key);
|
| - if (cachedResults) {
|
| - if (cachedResults->dir == props.direction && cachedResults->font == *m_font && cachedResults->locale == localeString) {
|
| - currentRun->applyShapeResult(cachedResults->buffer);
|
| - setGlyphPositionsForHarfBuzzRun(currentRun, cachedResults->buffer);
|
| -
|
| - hb_buffer_clear_contents(harfBuzzBuffer.get());
|
| -
|
| - runCache.moveToBack(cachedResults);
|
| -
|
| - continue;
|
| - }
|
| -
|
| - runCache.remove(cachedResults);
|
| - }
|
| -
|
| // Add a space as pre-context to the buffer. This prevents showing dotted-circle
|
| // for combining marks at the beginning of runs.
|
| static const uint16_t preContext = ' ';
|
| @@ -877,8 +728,6 @@ bool HarfBuzzShaper::shapeHarfBuzzRuns()
|
| currentRun->applyShapeResult(harfBuzzBuffer.get());
|
| setGlyphPositionsForHarfBuzzRun(currentRun, harfBuzzBuffer.get());
|
|
|
| - runCache.insert(key, new CachedShapingResults(harfBuzzBuffer.get(), m_font, props.direction, localeString));
|
| -
|
| harfBuzzBuffer.set(hb_buffer_create());
|
| }
|
|
|
|
|