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

Side by Side Diff: dm/DMSrcSink.cpp

Issue 859623002: DM: Don't hold onto data longer than needed. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 11 months 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
« no previous file with comments | « dm/DMSrcSink.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #include "DMSrcSink.h" 1 #include "DMSrcSink.h"
2 #include "SamplePipeControllers.h" 2 #include "SamplePipeControllers.h"
3 #include "SkCommonFlags.h" 3 #include "SkCommonFlags.h"
4 #include "SkDocument.h" 4 #include "SkDocument.h"
5 #include "SkMultiPictureDraw.h" 5 #include "SkMultiPictureDraw.h"
6 #include "SkOSFile.h" 6 #include "SkOSFile.h"
7 #include "SkPictureRecorder.h" 7 #include "SkPictureRecorder.h"
8 #include "SkRandom.h" 8 #include "SkRandom.h"
9 9
10 namespace DM { 10 namespace DM {
11 11
12 void SafeUnref(SkPicture* p) { SkSafeUnref(p); }
13 void SafeUnref(SkData* d) { SkSafeUnref(d); }
14
15 // FIXME: the GM objects themselves are not threadsafe, so we create and destroy them as needed.
16
17 GMSrc::GMSrc(skiagm::GMRegistry::Factory factory) : fFactory(factory) {} 12 GMSrc::GMSrc(skiagm::GMRegistry::Factory factory) : fFactory(factory) {}
18 13
19 Error GMSrc::draw(SkCanvas* canvas) const { 14 Error GMSrc::draw(SkCanvas* canvas) const {
20 SkAutoTDelete<skiagm::GM> gm(fFactory(NULL)); 15 SkAutoTDelete<skiagm::GM> gm(fFactory(NULL));
21 canvas->concat(gm->getInitialTransform()); 16 canvas->concat(gm->getInitialTransform());
22 gm->draw(canvas); 17 gm->draw(canvas);
23 return ""; 18 return "";
24 } 19 }
25 20
26 SkISize GMSrc::size() const { 21 SkISize GMSrc::size() const {
27 SkAutoTDelete<skiagm::GM> gm(fFactory(NULL)); 22 SkAutoTDelete<skiagm::GM> gm(fFactory(NULL));
28 return gm->getISize(); 23 return gm->getISize();
29 } 24 }
30 25
31 Name GMSrc::name() const { 26 Name GMSrc::name() const {
32 SkAutoTDelete<skiagm::GM> gm(fFactory(NULL)); 27 SkAutoTDelete<skiagm::GM> gm(fFactory(NULL));
33 return gm->getName(); 28 return gm->getName();
34 } 29 }
35 30
36 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~*/ 31 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~*/
37 32
38 // The first call to draw() or size() will mmap the file to an SkData. ~ImageSr c unrefs it.
39 struct LazyLoadImage {
40 LazyLoadImage(const char* path) : path(path) {}
41 const char* path;
42
43 SkData* operator()() const { return SkData::NewFromFileName(path); }
44 };
45
46 ImageSrc::ImageSrc(SkString path, int subsets) : fPath(path), fSubsets(subsets) {} 33 ImageSrc::ImageSrc(SkString path, int subsets) : fPath(path), fSubsets(subsets) {}
47 34
48 Error ImageSrc::draw(SkCanvas* canvas) const { 35 Error ImageSrc::draw(SkCanvas* canvas) const {
49 const SkData* encoded = fEncoded.get(LazyLoadImage(fPath.c_str())); 36 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str()));
50 if (!encoded) { 37 if (!encoded) {
51 return SkStringPrintf("Couldn't read %s.", fPath.c_str()); 38 return SkStringPrintf("Couldn't read %s.", fPath.c_str());
52 } 39 }
53 if (fSubsets == 0) { 40 if (fSubsets == 0) {
54 // Decode the full image. 41 // Decode the full image.
55 SkBitmap bitmap; 42 SkBitmap bitmap;
56 if (!SkImageDecoder::DecodeMemory(encoded->data(), encoded->size(), &bit map)) { 43 if (!SkImageDecoder::DecodeMemory(encoded->data(), encoded->size(), &bit map)) {
57 return SkStringPrintf("Couldn't decode %s.", fPath.c_str()); 44 return SkStringPrintf("Couldn't decode %s.", fPath.c_str());
58 } 45 }
46 encoded.reset((SkData*)NULL); // Might as well drop this when we're don e with it.
59 canvas->drawBitmap(bitmap, 0,0); 47 canvas->drawBitmap(bitmap, 0,0);
60 return ""; 48 return "";
61 } 49 }
62 // Decode random subsets. This is a little involved. 50 // Decode random subsets. This is a little involved.
63 SkMemoryStream stream(encoded->data(), encoded->size()); 51 SkMemoryStream stream(encoded->data(), encoded->size());
64 SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(&stream)); 52 SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(&stream));
65 if (!decoder) { 53 if (!decoder) {
66 return SkStringPrintf("Can't find a good decoder for %s.", fPath.c_str() ); 54 return SkStringPrintf("Can't find a good decoder for %s.", fPath.c_str() );
67 } 55 }
68 int w,h; 56 int w,h;
(...skipping 13 matching lines...) Expand all
82 SkBitmap subset; 70 SkBitmap subset;
83 if (!decoder->decodeSubset(&subset, rect, kUnknown_SkColorType/*use best fit*/)) { 71 if (!decoder->decodeSubset(&subset, rect, kUnknown_SkColorType/*use best fit*/)) {
84 return SkStringPrintf("Could not decode subset %d.\n", i); 72 return SkStringPrintf("Could not decode subset %d.\n", i);
85 } 73 }
86 canvas->drawBitmap(subset, SkIntToScalar(rect.fLeft), SkIntToScalar(rect .fTop)); 74 canvas->drawBitmap(subset, SkIntToScalar(rect.fLeft), SkIntToScalar(rect .fTop));
87 } 75 }
88 return ""; 76 return "";
89 } 77 }
90 78
91 SkISize ImageSrc::size() const { 79 SkISize ImageSrc::size() const {
92 const SkData* encoded = fEncoded.get(LazyLoadImage(fPath.c_str())); 80 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str()));
93 SkBitmap bitmap; 81 SkBitmap bitmap;
94 if (!encoded || !SkImageDecoder::DecodeMemory(encoded->data(), 82 if (!encoded || !SkImageDecoder::DecodeMemory(encoded->data(),
95 encoded->size(), 83 encoded->size(),
96 &bitmap, 84 &bitmap,
97 kUnknown_SkColorType, 85 kUnknown_SkColorType,
98 SkImageDecoder::kDecodeBounds_ Mode)) { 86 SkImageDecoder::kDecodeBounds_ Mode)) {
99 return SkISize::Make(0,0); 87 return SkISize::Make(0,0);
100 } 88 }
101 return bitmap.dimensions(); 89 return bitmap.dimensions();
102 } 90 }
103 91
104 Name ImageSrc::name() const { return SkOSPath::Basename(fPath.c_str()); } 92 Name ImageSrc::name() const { return SkOSPath::Basename(fPath.c_str()); }
105 93
106 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~*/ 94 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~*/
107 95
108 static const SkRect kSKPViewport = {0,0, 1000,1000}; 96 static const SkRect kSKPViewport = {0,0, 1000,1000};
109 97
110 // The first call to draw() or size() will read the file into an SkPicture. ~SK PSrc unrefs it.
111 struct LazyLoadPicture {
112 LazyLoadPicture(const char* path) : path(path) {}
113 const char* path;
114
115 SkPicture* operator()() const {
116 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path));
117 if (!stream) {
118 return NULL;
119 }
120 return SkPicture::CreateFromStream(stream);
121 }
122 };
123
124 SKPSrc::SKPSrc(SkString path) : fPath(path) {} 98 SKPSrc::SKPSrc(SkString path) : fPath(path) {}
125 99
126 Error SKPSrc::draw(SkCanvas* canvas) const { 100 Error SKPSrc::draw(SkCanvas* canvas) const {
127 const SkPicture* pic = fPic.get(LazyLoadPicture(fPath.c_str())); 101 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(fPath.c_str()));
128 if (!pic) { 102 if (!stream) {
129 return SkStringPrintf("Couldn't read %s.", fPath.c_str()); 103 return SkStringPrintf("Couldn't read %s.", fPath.c_str());
130 } 104 }
105 SkAutoTUnref<SkPicture> pic(SkPicture::CreateFromStream(stream));
106 if (!pic) {
107 return SkStringPrintf("Couldn't decode %s as a picture.", fPath.c_str()) ;
108 }
109 stream.reset((SkStream*)NULL); // Might as well drop this when we're done w ith it.
131 canvas->clipRect(kSKPViewport); 110 canvas->clipRect(kSKPViewport);
132 canvas->drawPicture(pic); 111 canvas->drawPicture(pic);
133 return ""; 112 return "";
134 } 113 }
135 114
136 SkISize SKPSrc::size() const { 115 SkISize SKPSrc::size() const {
137 const SkPicture* pic = fPic.get(LazyLoadPicture(fPath.c_str())); 116 // This may be unnecessarily large.
138 if (!pic) { 117 return kSKPViewport.roundOut().size();
139 return SkISize::Make(0,0);
140 }
141 SkRect cull = pic->cullRect();
142 if (!cull.intersect(kSKPViewport)) {
143 sk_throw();
144 }
145 SkIRect bounds;
146 cull.roundOut(&bounds);
147 SkISize size = { bounds.width(), bounds.height() };
148 return size;
149 } 118 }
150 119
151 Name SKPSrc::name() const { return SkOSPath::Basename(fPath.c_str()); } 120 Name SKPSrc::name() const { return SkOSPath::Basename(fPath.c_str()); }
152 121
153 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~*/ 122 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~*/
154 123
155 GPUSink::GPUSink(GrContextFactory::GLContextType ct, 124 GPUSink::GPUSink(GrContextFactory::GLContextType ct,
156 GrGLStandard api, 125 GrGLStandard api,
157 int samples, 126 int samples,
158 bool dfText, 127 bool dfText,
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 surfaces.unrefAll(); 341 surfaces.unrefAll();
373 return ""; 342 return "";
374 } 343 }
375 SkISize size() const SK_OVERRIDE { return fSize; } 344 SkISize size() const SK_OVERRIDE { return fSize; }
376 Name name() const SK_OVERRIDE { sk_throw(); return ""; } // No one shou ld be calling this. 345 Name name() const SK_OVERRIDE { sk_throw(); return ""; } // No one shou ld be calling this.
377 } proxy(fW, fH, pic, src.size()); 346 } proxy(fW, fH, pic, src.size());
378 return fSink->draw(proxy, bitmap, stream); 347 return fSink->draw(proxy, bitmap, stream);
379 } 348 }
380 349
381 } // namespace DM 350 } // namespace DM
OLDNEW
« no previous file with comments | « dm/DMSrcSink.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698