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

Unified Diff: src/core/SkImageCacherator.cpp

Issue 2462013003: Deferred image generator subsetting (Closed)
Patch Set: unlocked generator access comments Created 4 years, 1 month 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 | « src/core/SkImageCacherator.h ('k') | src/image/SkImage_Generator.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkImageCacherator.cpp
diff --git a/src/core/SkImageCacherator.cpp b/src/core/SkImageCacherator.cpp
index 75f8734e838004ac63b3bc393524b2223d69603f..124da389dcb8ae235300e0663fca37bbe28e3489 100644
--- a/src/core/SkImageCacherator.cpp
+++ b/src/core/SkImageCacherator.cpp
@@ -10,7 +10,6 @@
#include "SkImage_Base.h"
#include "SkImageCacherator.h"
#include "SkMallocPixelRef.h"
-#include "SkMutex.h"
#include "SkNextID.h"
#include "SkPixelRef.h"
#include "SkResourceCache.h"
@@ -33,24 +32,6 @@
// see skbug.com/ 4971, 5128, ...
//#define SK_SUPPORT_COMPRESSED_TEXTURES_IN_CACHERATOR
-// Ref-counted tuple(SkImageGenerator, SkMutex) which allows sharing of one generator
-// among several cacherators.
-class SkImageCacherator::SharedGenerator final : public SkNVRefCnt<SharedGenerator> {
-public:
- static sk_sp<SharedGenerator> Make(SkImageGenerator* gen) {
- return gen ? sk_sp<SharedGenerator>(new SharedGenerator(gen)) : nullptr;
- }
-
-private:
- explicit SharedGenerator(SkImageGenerator* gen) : fGenerator(gen) { SkASSERT(gen); }
-
- friend class ScopedGenerator;
-
- std::unique_ptr<SkImageGenerator> fGenerator;
- SkMutex fMutex;
-};
-
-
// Helper for exclusive access to a shared generator.
class SkImageCacherator::ScopedGenerator {
public:
@@ -73,22 +54,22 @@ private:
SkAutoExclusive fAutoAquire;
};
-SkImageCacherator::Validator::Validator(SkImageGenerator* gen, const SkIRect* subset)
- // We are required to take ownership of gen, regardless of whether we instantiate a cacherator
- // or not. On instantiation, the client is responsible for transferring ownership.
- : fSharedGenerator(SkImageCacherator::SharedGenerator::Make(gen)) {
+SkImageCacherator::Validator::Validator(sk_sp<SharedGenerator> gen, const SkIRect* subset)
+ : fSharedGenerator(std::move(gen)) {
if (!fSharedGenerator) {
return;
}
- const SkImageInfo& info = gen->getInfo();
+ // The following generator accessors are safe without acquiring the mutex (const getters).
+ // TODO: refactor to use a ScopedGenerator instead, for clarity.
+ const SkImageInfo& info = fSharedGenerator->fGenerator->getInfo();
if (info.isEmpty()) {
fSharedGenerator.reset();
return;
}
- fUniqueID = gen->uniqueID();
+ fUniqueID = fSharedGenerator->fGenerator->uniqueID();
const SkIRect bounds = SkIRect::MakeWH(info.width(), info.height());
if (subset) {
if (!bounds.contains(*subset)) {
@@ -107,11 +88,9 @@ SkImageCacherator::Validator::Validator(SkImageGenerator* gen, const SkIRect* su
fOrigin = SkIPoint::Make(subset->x(), subset->y());
}
-SkImageCacherator::Validator::~Validator() {}
-
SkImageCacherator* SkImageCacherator::NewFromGenerator(SkImageGenerator* gen,
const SkIRect* subset) {
- Validator validator(gen, subset);
+ Validator validator(SharedGenerator::Make(gen), subset);
return validator ? new SkImageCacherator(&validator) : nullptr;
}
« no previous file with comments | « src/core/SkImageCacherator.h ('k') | src/image/SkImage_Generator.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698