Remove search of desperation
Change-Id: Id862057ad5b853e979a9e93fc43a559360b400d9
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/268842
Commit-Queue: Herb Derby <herb@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
Reviewed-by: Khushal Sagar <khushalsagar@chromium.org>
diff --git a/src/core/SkRemoteGlyphCache.h b/src/core/SkRemoteGlyphCache.h
index d78b431..4a3bd36 100644
--- a/src/core/SkRemoteGlyphCache.h
+++ b/src/core/SkRemoteGlyphCache.h
@@ -176,11 +176,11 @@
kGlyphImage = 2,
kGlyphPath = 3,
- // The original glyph could not be found and a fallback was used.
+ // (DEPRECATED) The original glyph could not be found and a fallback was used.
kGlyphMetricsFallback = 4,
kGlyphPathFallback = 5,
- kLast = kGlyphPathFallback
+ kLast = kGlyphPath
};
// An interface to delete handles that may be pinned by the remote server.
diff --git a/src/core/SkStrike.cpp b/src/core/SkStrike.cpp
index cf49926..7f828ef 100644
--- a/src/core/SkStrike.cpp
+++ b/src/core/SkStrike.cpp
@@ -124,20 +124,6 @@
return glyph;
}
-const SkGlyph* SkStrike::getCachedGlyphAnySubPix(SkGlyphID glyphID, SkPackedGlyphID vetoID) const {
- for (SkFixed subY = 0; subY < SK_Fixed1; subY += SK_FixedQuarter) {
- for (SkFixed subX = 0; subX < SK_Fixed1; subX += SK_FixedQuarter) {
- SkPackedGlyphID packedGlyphID{glyphID, subX, subY};
- if (packedGlyphID == vetoID) continue;
- if (SkGlyph* glyphPtr = fGlyphMap.findOrNull(packedGlyphID)) {
- return glyphPtr;
- }
- }
- }
-
- return nullptr;
-}
-
SkSpan<const SkGlyph*> SkStrike::metrics(SkSpan<const SkGlyphID> glyphIDs,
const SkGlyph* results[]) {
return this->internalPrepare(glyphIDs, kMetricsOnly, results);
diff --git a/src/core/SkStrike.h b/src/core/SkStrike.h
index 0ae57ac..20d0d3f 100644
--- a/src/core/SkStrike.h
+++ b/src/core/SkStrike.h
@@ -63,11 +63,6 @@
void findIntercepts(const SkScalar bounds[2], SkScalar scale, SkScalar xPos,
SkGlyph* , SkScalar* array, int* count);
- /** Find any glyph in this cache with the given ID, regardless of subpixel positioning.
- * If set and present, skip over the glyph with vetoID.
- */
- const SkGlyph* getCachedGlyphAnySubPix(SkGlyphID,
- SkPackedGlyphID vetoID = SkPackedGlyphID()) const;
/** Return the vertical metrics for this strike.
*/
diff --git a/src/core/SkStrikeCache.cpp b/src/core/SkStrikeCache.cpp
index 482776d..205ae28 100644
--- a/src/core/SkStrikeCache.cpp
+++ b/src/core/SkStrikeCache.cpp
@@ -279,84 +279,6 @@
return nullptr;
}
-
-static bool loose_compare(const SkDescriptor& lhs, const SkDescriptor& rhs) {
- uint32_t size;
- auto ptr = lhs.findEntry(kRec_SkDescriptorTag, &size);
- SkScalerContextRec lhsRec;
- std::memcpy((void*)&lhsRec, ptr, size);
-
- ptr = rhs.findEntry(kRec_SkDescriptorTag, &size);
- SkScalerContextRec rhsRec;
- std::memcpy((void*)&rhsRec, ptr, size);
-
- // If these don't match, there's no way we can use these strikes interchangeably.
- // Note that a typeface from each renderer maps to a unique proxy typeface on the GPU,
- // keyed in the glyph cache using fontID in the SkDescriptor. By limiting this search
- // to descriptors with the same fontID, we ensure that a renderer never uses glyphs
- // generated by a different renderer.
- return
- lhsRec.fFontID == rhsRec.fFontID &&
- lhsRec.fTextSize == rhsRec.fTextSize &&
- lhsRec.fPreScaleX == rhsRec.fPreScaleX &&
- lhsRec.fPreSkewX == rhsRec.fPreSkewX &&
- lhsRec.fPost2x2[0][0] == rhsRec.fPost2x2[0][0] &&
- lhsRec.fPost2x2[0][1] == rhsRec.fPost2x2[0][1] &&
- lhsRec.fPost2x2[1][0] == rhsRec.fPost2x2[1][0] &&
- lhsRec.fPost2x2[1][1] == rhsRec.fPost2x2[1][1];
-}
-
-bool SkStrikeCache::desperationSearchForImage(const SkDescriptor& desc, SkGlyph* glyph,
- SkStrike* targetCache) {
- SkAutoSpinlock ac(fLock);
-
- SkGlyphID glyphID = glyph->getGlyphID();
- for (Node* node = fHead; node != nullptr; node = node->fNext) {
- if (loose_compare(node->fStrike.getDescriptor(), desc)) {
- if (SkGlyph *fallback = node->fStrike.glyphOrNull(glyph->getPackedID())) {
- // This desperate-match node may disappear as soon as we drop fLock, so we
- // need to copy the glyph from node into this strike, including a
- // deep copy of the mask.
- targetCache->mergeGlyphAndImage(glyph->getPackedID(), *fallback);
- return true;
- }
-
- // Look for any sub-pixel pos for this glyph, in case there is a pos mismatch.
- if (const auto* fallback = node->fStrike.getCachedGlyphAnySubPix(glyphID)) {
- targetCache->mergeGlyphAndImage(glyph->getPackedID(), *fallback);
- return true;
- }
- }
- }
-
- return false;
-}
-
-bool SkStrikeCache::desperationSearchForPath(
- const SkDescriptor& desc, SkGlyphID glyphID, SkPath* path) {
- SkAutoSpinlock ac(fLock);
-
- // The following is wrong there is subpixel positioning with paths...
- // Paths are only ever at sub-pixel position (0,0), so we can just try that directly rather
- // than try our packed position first then search all others on failure like for masks.
- //
- // This will have to search the sub-pixel positions too.
- // There is also a problem with accounting for cache size with shared path data.
- for (Node* node = fHead; node != nullptr; node = node->fNext) {
- if (loose_compare(node->fStrike.getDescriptor(), desc)) {
- if (SkGlyph *from = node->fStrike.glyphOrNull(SkPackedGlyphID{glyphID})) {
- if (from->setPathHasBeenCalled() && from->path() != nullptr) {
- // We can just copy the path out by value here, so no need to worry
- // about the lifetime of this desperate-match node.
- *path = *from->path();
- return true;
- }
- }
- }
- }
- return false;
-}
-
SkExclusiveStrikePtr SkStrikeCache::createStrikeExclusive(
const SkDescriptor& desc,
std::unique_ptr<SkScalerContext> scaler,
@@ -588,5 +510,3 @@
}
}
#endif
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/core/SkStrikeCache.h b/src/core/SkStrikeCache.h
index 47b5f26..db5ee6b 100644
--- a/src/core/SkStrikeCache.h
+++ b/src/core/SkStrikeCache.h
@@ -82,13 +82,6 @@
const SkScalerContextEffects& effects,
const SkTypeface& typeface);
- // Routines to find suitable data when working in a remote cache situation. These are
- // suitable as substitutes for similar calls in SkScalerContext.
- bool desperationSearchForImage(const SkDescriptor& desc,
- SkGlyph* glyph,
- SkStrike* targetCache);
- bool desperationSearchForPath(const SkDescriptor& desc, SkGlyphID glyphID, SkPath* path);
-
SkScopedStrikeForGPU findOrCreateScopedStrike(const SkDescriptor& desc,
const SkScalerContextEffects& effects,
const SkTypeface& typeface) override;
diff --git a/src/core/SkTypeface_remote.cpp b/src/core/SkTypeface_remote.cpp
index dd6c2e2..c08c2e9 100644
--- a/src/core/SkTypeface_remote.cpp
+++ b/src/core/SkTypeface_remote.cpp
@@ -42,27 +42,6 @@
}
glyph->fMaskFormat = fRec.fMaskFormat;
-
- // Since the scaler context is being called, we don't have the needed data. Try to find a
- // fallback before failing.
- if (fCache && fCache->glyphOrNull(glyph->getPackedID()) != nullptr) {
- // First check the original cache, in case there is a sub-pixel pos mismatch.
- if (const SkGlyph* from =
- fCache->getCachedGlyphAnySubPix(glyph->getGlyphID(), glyph->getPackedID())) {
- fCache->mergeGlyphAndImage(glyph->getPackedID(), *from);
- fDiscardableManager->notifyCacheMiss(
- SkStrikeClient::CacheMissType::kGlyphMetricsFallback);
- return;
- }
-
- // Now check other caches for a desc mismatch.
- if (fStrikeCache->desperationSearchForImage(fCache->getDescriptor(), glyph, fCache)) {
- fDiscardableManager->notifyCacheMiss(
- SkStrikeClient::CacheMissType::kGlyphMetricsFallback);
- return;
- }
- }
-
glyph->zeroMetrics();
fDiscardableManager->notifyCacheMiss(SkStrikeClient::CacheMissType::kGlyphMetrics);
}
@@ -84,14 +63,8 @@
SkDebugf("GlyphCacheMiss generatePath: %s\n", this->getRec().dump().c_str());
}
- // Since the scaler context is being called, we don't have the needed data. Try to find a
- // fallback before failing.
- auto desc = SkScalerContext::DescriptorGivenRecAndEffects(this->getRec(), this->getEffects());
- bool foundPath = fStrikeCache && fStrikeCache->desperationSearchForPath(*desc, glyphID, path);
- fDiscardableManager->notifyCacheMiss(foundPath
- ? SkStrikeClient::CacheMissType::kGlyphPathFallback
- : SkStrikeClient::CacheMissType::kGlyphPath);
- return foundPath;
+ fDiscardableManager->notifyCacheMiss(SkStrikeClient::CacheMissType::kGlyphPath);
+ return false;
}
void SkScalerContextProxy::generateFontMetrics(SkFontMetrics* metrics) {
diff --git a/tests/SkRemoteGlyphCacheTest.cpp b/tests/SkRemoteGlyphCacheTest.cpp
index fd327e8..c3b21c2 100644
--- a/tests/SkRemoteGlyphCacheTest.cpp
+++ b/tests/SkRemoteGlyphCacheTest.cpp
@@ -821,122 +821,6 @@
discardableManager->unlockAndDeleteAll();
}
-DEF_TEST(SkRemoteGlyphCache_SearchOfDesperation, reporter) {
- // Build proxy typeface on the client for initializing the cache.
- sk_sp<DiscardableManager> discardableManager = sk_make_sp<DiscardableManager>();
- SkStrikeServer server(discardableManager.get());
- SkStrikeClient client(discardableManager, false);
-
- auto serverTf = SkTypeface::MakeFromName("monospace", SkFontStyle());
- auto tfData = server.serializeTypeface(serverTf.get());
- auto clientTf = client.deserializeTypeface(tfData->data(), tfData->size());
- REPORTER_ASSERT(reporter, clientTf);
-
- SkFont font;
- font.setTypeface(clientTf);
- font.setSubpixel(true);
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setColor(SK_ColorRED);
-
- auto lostGlyphID = SkPackedGlyphID(1, SK_FixedHalf, SK_FixedHalf);
- const uint8_t glyphImage[] = {0xFF, 0xFF};
-
- SkStrikeCache strikeCache;
-
- // Build a fallback cache.
- {
- SkAutoDescriptor ad;
- SkScalerContextRec rec;
- SkScalerContextEffects effects;
- SkScalerContextFlags flags = SkScalerContextFlags::kFakeGammaAndBoostContrast;
- SkScalerContext::MakeRecAndEffects(
- font, paint, SkSurfacePropsCopyOrDefault(nullptr), flags,
- SkMatrix::I(), &rec, &effects);
- auto desc = SkScalerContext::AutoDescriptorGivenRecAndEffects(rec, effects, &ad);
-
- auto fallbackCache = strikeCache.findOrCreateStrikeExclusive(*desc, effects, *clientTf);
- SkGlyphPrototype proto = {lostGlyphID, 0.f, 0.f, 2, 1, 0, 0, SkMask::kA8_Format, false};
- fallbackCache->glyphFromPrototype(proto, (void*)glyphImage);
- }
-
- // Make sure we can find the fall back cache.
- {
- SkAutoDescriptor ad;
- SkScalerContextRec rec;
- SkScalerContextEffects effects;
- SkScalerContextFlags flags = SkScalerContextFlags::kFakeGammaAndBoostContrast;
- SkScalerContext::MakeRecAndEffects(
- font, paint, SkSurfacePropsCopyOrDefault(nullptr), flags,
- SkMatrix::I(), &rec, &effects);
- auto desc = SkScalerContext::AutoDescriptorGivenRecAndEffects(rec, effects, &ad);
- auto testCache = strikeCache.findStrikeExclusive(*desc);
- REPORTER_ASSERT(reporter, !(testCache == nullptr));
- }
-
- // Create the target cache.
- SkExclusiveStrikePtr testCache;
- SkAutoDescriptor ad;
- SkScalerContextRec rec;
- SkScalerContextEffects effects;
- SkScalerContextFlags flags = SkScalerContextFlags::kNone;
- SkScalerContext::MakeRecAndEffects(
- font, paint, SkSurfacePropsCopyOrDefault(nullptr), flags,
- SkMatrix::I(), &rec, &effects);
- auto desc = SkScalerContext::AutoDescriptorGivenRecAndEffects(rec, effects, &ad);
- testCache = strikeCache.findStrikeExclusive(*desc);
- REPORTER_ASSERT(reporter, testCache == nullptr);
- testCache = strikeCache.createStrikeExclusive(*desc,
- clientTf->createScalerContext(effects, desc));
- auto scalerProxy = static_cast<SkScalerContextProxy*>(testCache->getScalerContext());
- scalerProxy->initCache(testCache.get(), &strikeCache);
-
- auto rounding = testCache->roundingSpec();
- SkBulkGlyphMetricsAndImages metricsAndImages{std::move(testCache)};
-
- // Look for the lost glyph.
- {
- SkPoint pt{SkFixedToScalar(lostGlyphID.getSubXFixed()),
- SkFixedToScalar(lostGlyphID.getSubYFixed())};
- SkPackedGlyphID packedID{
- lostGlyphID.glyphID(), pt, rounding.ignorePositionFieldMask};
-
- const SkGlyph* lostGlyph = metricsAndImages.glyph(packedID);
-
- REPORTER_ASSERT(reporter, lostGlyph->height() == 1);
- REPORTER_ASSERT(reporter, lostGlyph->width() == 2);
- REPORTER_ASSERT(reporter, lostGlyph->maskFormat() == SkMask::kA8_Format);
- REPORTER_ASSERT(reporter, memcmp(lostGlyph->image(), glyphImage, sizeof(glyphImage)) == 0);
- }
-
- // Look for the lost glyph with a different sub-pix position.
- {
- SkPoint pt{SkFixedToScalar(SK_FixedQuarter),
- SkFixedToScalar(SK_FixedQuarter)};
- SkPackedGlyphID packedID{
- lostGlyphID.glyphID(), pt, rounding.ignorePositionFieldMask};
- const SkGlyph* lostGlyph = metricsAndImages.glyph(packedID);
-
- REPORTER_ASSERT(reporter, lostGlyph->height() == 1);
- REPORTER_ASSERT(reporter, lostGlyph->width() == 2);
- REPORTER_ASSERT(reporter, lostGlyph->maskFormat() == SkMask::kA8_Format);
- REPORTER_ASSERT(reporter, memcmp(lostGlyph->image(), glyphImage, sizeof(glyphImage)) == 0);
- }
-
- for (uint32_t i = 0; i <= SkStrikeClient::CacheMissType::kLast; ++i) {
- if (i == SkStrikeClient::CacheMissType::kGlyphMetricsFallback ||
- i == SkStrikeClient::CacheMissType::kFontMetrics) {
- REPORTER_ASSERT(reporter, discardableManager->cacheMissCount(i) == 2);
- } else {
- REPORTER_ASSERT(reporter, discardableManager->cacheMissCount(i) == 0);
- }
- }
- strikeCache.validateGlyphCacheDataSize();
-
- // Must unlock everything on termination, otherwise valgrind complains about memory leaks.
- discardableManager->unlockAndDeleteAll();
-}
-
DEF_TEST(SkRemoteGlyphCache_ReWriteGlyph, reporter) {
// Build proxy typeface on the client for initializing the cache.
sk_sp<DiscardableManager> discardableManager = sk_make_sp<DiscardableManager>();