83 lines
2.5 KiB
C++
83 lines
2.5 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef GFX_FONT_IMPL_H
|
|
#define GFX_FONT_IMPL_H
|
|
|
|
#include "mozilla/DebugOnly.h"
|
|
using mozilla::DebugOnly;
|
|
|
|
#ifdef __GNUC__
|
|
#define GFX_MAYBE_UNUSED __attribute__((unused))
|
|
#else
|
|
#define GFX_MAYBE_UNUSED
|
|
#endif
|
|
|
|
template<typename T>
|
|
gfxShapedWord*
|
|
gfxFont::GetShapedWord(DrawTarget *aDrawTarget,
|
|
const T *aText,
|
|
uint32_t aLength,
|
|
uint32_t aHash,
|
|
Script aRunScript,
|
|
bool aVertical,
|
|
int32_t aAppUnitsPerDevUnit,
|
|
uint32_t aFlags,
|
|
gfxTextPerfMetrics *aTextPerf GFX_MAYBE_UNUSED)
|
|
{
|
|
// if the cache is getting too big, flush it and start over
|
|
uint32_t wordCacheMaxEntries =
|
|
gfxPlatform::GetPlatform()->WordCacheMaxEntries();
|
|
if (mWordCache->Count() > wordCacheMaxEntries) {
|
|
NS_WARNING("flushing shaped-word cache");
|
|
ClearCachedWords();
|
|
}
|
|
|
|
// if there's a cached entry for this word, just return it
|
|
CacheHashKey key(aText, aLength, aHash,
|
|
aRunScript,
|
|
aAppUnitsPerDevUnit,
|
|
aFlags);
|
|
|
|
CacheHashEntry *entry = mWordCache->PutEntry(key);
|
|
if (!entry) {
|
|
NS_WARNING("failed to create word cache entry - expect missing text");
|
|
return nullptr;
|
|
}
|
|
gfxShapedWord* sw = entry->mShapedWord.get();
|
|
|
|
if (sw) {
|
|
sw->ResetAge();
|
|
#ifndef RELEASE_OR_BETA
|
|
if (aTextPerf) {
|
|
aTextPerf->current.wordCacheHit++;
|
|
}
|
|
#endif
|
|
return sw;
|
|
}
|
|
|
|
#ifndef RELEASE_OR_BETA
|
|
if (aTextPerf) {
|
|
aTextPerf->current.wordCacheMiss++;
|
|
}
|
|
#endif
|
|
|
|
sw = gfxShapedWord::Create(aText, aLength, aRunScript, aAppUnitsPerDevUnit,
|
|
aFlags);
|
|
entry->mShapedWord.reset(sw);
|
|
if (!sw) {
|
|
NS_WARNING("failed to create gfxShapedWord - expect missing text");
|
|
return nullptr;
|
|
}
|
|
|
|
DebugOnly<bool> ok =
|
|
ShapeText(aDrawTarget, aText, 0, aLength, aRunScript, aVertical, sw);
|
|
|
|
NS_WARNING_ASSERTION(ok, "failed to shape word - expect garbled text");
|
|
|
|
return sw;
|
|
}
|
|
|
|
#endif // GFX_FONT_IMPL_H
|