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

Side by Side Diff: src/core/SkImageCacherator.cpp

Issue 2453473004: Avoid separate allocation of SkImageCacherator (Closed)
Patch Set: pass validator to ctor 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkBitmap.h" 8 #include "SkBitmap.h"
9 #include "SkBitmapCache.h" 9 #include "SkBitmapCache.h"
10 #include "SkImage_Base.h" 10 #include "SkImage_Base.h"
(...skipping 14 matching lines...) Expand all
25 #include "SkGrPriv.h" 25 #include "SkGrPriv.h"
26 #endif 26 #endif
27 27
28 // Until we actually have codecs/etc. that can contain/support a GPU texture for mat 28 // Until we actually have codecs/etc. that can contain/support a GPU texture for mat
29 // skip this step, since for some generators, returning their encoded data as a SkData 29 // skip this step, since for some generators, returning their encoded data as a SkData
30 // can be somewhat expensive, and this call doesn't indicate to the generator th at we're 30 // can be somewhat expensive, and this call doesn't indicate to the generator th at we're
31 // only interested in GPU datas... 31 // only interested in GPU datas...
32 // see skbug.com/ 4971, 5128, ... 32 // see skbug.com/ 4971, 5128, ...
33 //#define SK_SUPPORT_COMPRESSED_TEXTURES_IN_CACHERATOR 33 //#define SK_SUPPORT_COMPRESSED_TEXTURES_IN_CACHERATOR
34 34
35 SkImageCacherator* SkImageCacherator::NewFromGenerator(SkImageGenerator* gen, 35 SkImageCacherator::Validator::Validator(SkImageGenerator* gen, const SkIRect* su bset)
36 const SkIRect* subset) { 36 // We are required to take ownership of gen, regardless of whether we instan tiate a cacherator
37 // or not. On instantiation, the client is responsible for transferring own ership.
38 : fGenerator(gen) {
39
37 if (!gen) { 40 if (!gen) {
38 return nullptr; 41 return;
39 } 42 }
40 43
41 // We are required to take ownership of gen, regardless of if we return a ca cherator or not
42 SkAutoTDelete<SkImageGenerator> genHolder(gen);
43
44 const SkImageInfo& info = gen->getInfo(); 44 const SkImageInfo& info = gen->getInfo();
45 if (info.isEmpty()) { 45 if (info.isEmpty()) {
46 return nullptr; 46 fGenerator.reset();
47 return;
47 } 48 }
48 49
49 uint32_t uniqueID = gen->uniqueID(); 50 fUniqueID = gen->uniqueID();
50 const SkIRect bounds = SkIRect::MakeWH(info.width(), info.height()); 51 const SkIRect bounds = SkIRect::MakeWH(info.width(), info.height());
51 if (subset) { 52 if (subset) {
52 if (!bounds.contains(*subset)) { 53 if (!bounds.contains(*subset)) {
53 return nullptr; 54 fGenerator.reset();
55 return;
54 } 56 }
55 if (*subset != bounds) { 57 if (*subset != bounds) {
56 // we need a different uniqueID since we really are a subset of the raw generator 58 // we need a different uniqueID since we really are a subset of the raw generator
57 uniqueID = SkNextID::ImageID(); 59 fUniqueID = SkNextID::ImageID();
58 } 60 }
59 } else { 61 } else {
60 subset = &bounds; 62 subset = &bounds;
61 } 63 }
62 64
63 // Now that we know we can hand-off the generator (to be owned by the cacher ator) we can 65 fInfo = info.makeWH(subset->width(), subset->height());
64 // release our holder. (we DONT want to delete it here anymore) 66 fOrigin = SkIPoint::Make(subset->x(), subset->y());
65 genHolder.release();
66
67 return new SkImageCacherator(gen, gen->getInfo().makeWH(subset->width(), sub set->height()),
68 SkIPoint::Make(subset->x(), subset->y()), uniqu eID);
69 } 67 }
70 68
71 SkImageCacherator::SkImageCacherator(SkImageGenerator* gen, const SkImageInfo& i nfo, 69 SkImageCacherator* SkImageCacherator::NewFromGenerator(SkImageGenerator* gen,
72 const SkIPoint& origin, uint32_t uniqueID) 70 const SkIRect* subset) {
73 : fNotThreadSafeGenerator(gen) 71 Validator validator(gen, subset);
74 , fInfo(info) 72
75 , fOrigin(origin) 73 return validator ? new SkImageCacherator(&validator) : nullptr;
76 , fUniqueID(uniqueID) 74 }
77 {} 75
76 SkImageCacherator::SkImageCacherator(Validator* validator)
77 : fNotThreadSafeGenerator(validator->fGenerator.release()) // we take owners hip
78 , fInfo(validator->fInfo)
79 , fOrigin(validator->fOrigin)
80 , fUniqueID(validator->fUniqueID)
81 {
82 SkASSERT(fNotThreadSafeGenerator);
83 }
78 84
79 SkData* SkImageCacherator::refEncoded(GrContext* ctx) { 85 SkData* SkImageCacherator::refEncoded(GrContext* ctx) {
80 ScopedGenerator generator(this); 86 ScopedGenerator generator(this);
81 return generator->refEncodedData(ctx); 87 return generator->refEncodedData(ctx);
82 } 88 }
83 89
84 static bool check_output_bitmap(const SkBitmap& bitmap, uint32_t expectedID) { 90 static bool check_output_bitmap(const SkBitmap& bitmap, uint32_t expectedID) {
85 SkASSERT(bitmap.getGenerationID() == expectedID); 91 SkASSERT(bitmap.getGenerationID() == expectedID);
86 SkASSERT(bitmap.isImmutable()); 92 SkASSERT(bitmap.isImmutable());
87 SkASSERT(bitmap.getPixels()); 93 SkASSERT(bitmap.getPixels());
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 353
348 #else 354 #else
349 355
350 GrTexture* SkImageCacherator::lockAsTexture(GrContext* ctx, const GrTextureParam s&, 356 GrTexture* SkImageCacherator::lockAsTexture(GrContext* ctx, const GrTextureParam s&,
351 SkSourceGammaTreatment gammaTreatmen t, 357 SkSourceGammaTreatment gammaTreatmen t,
352 const SkImage* client, SkImage::Cach ingHint) { 358 const SkImage* client, SkImage::Cach ingHint) {
353 return nullptr; 359 return nullptr;
354 } 360 }
355 361
356 #endif 362 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698