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

Side by Side Diff: dm/DMWriteTask.cpp

Issue 802793002: Add image decoding mode to DM. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: transparent, build fixes Created 6 years 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/DMImageTask.cpp ('k') | gyp/dm.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #include "DMWriteTask.h" 1 #include "DMWriteTask.h"
2 2
3 #include "DMJsonWriter.h" 3 #include "DMJsonWriter.h"
4 #include "DMUtil.h" 4 #include "DMUtil.h"
5 #include "SkColorPriv.h" 5 #include "SkColorPriv.h"
6 #include "SkCommonFlags.h" 6 #include "SkCommonFlags.h"
7 #include "SkData.h" 7 #include "SkData.h"
8 #include "SkImageEncoder.h" 8 #include "SkImageEncoder.h"
9 #include "SkMD5.h" 9 #include "SkMD5.h"
10 #include "SkMallocPixelRef.h" 10 #include "SkMallocPixelRef.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 : CpuTask(parent) 53 : CpuTask(parent)
54 , fBaseName(find_base_name(parent, &fSuffixes)) 54 , fBaseName(find_base_name(parent, &fSuffixes))
55 , fSourceType(sourceType) 55 , fSourceType(sourceType)
56 , fData(data) 56 , fData(data)
57 , fExtension(ext) { 57 , fExtension(ext) {
58 SkASSERT(fData.get()); 58 SkASSERT(fData.get());
59 SkASSERT(fData->unique()); 59 SkASSERT(fData->unique());
60 } 60 }
61 61
62 void WriteTask::makeDirOrFail(SkString dir) { 62 void WriteTask::makeDirOrFail(SkString dir) {
63 if (!sk_mkdir(dir.c_str())) { 63 // This can be a little racy, so if it fails check to see if someone else su cceeded.
64 this->fail(); 64 if (!sk_mkdir(dir.c_str()) && !sk_isdir(dir.c_str())) {
65 this->fail("Can't make directory.");
65 } 66 }
66 } 67 }
67 68
68 static SkString get_md5_string(SkMD5* hasher) { 69 static SkString get_md5_string(SkMD5* hasher) {
69 SkMD5::Digest digest; 70 SkMD5::Digest digest;
70 hasher->finish(digest); 71 hasher->finish(digest);
71 72
72 SkString md5; 73 SkString md5;
73 for (int i = 0; i < 16; i++) { 74 for (int i = 0; i < 16; i++) {
74 md5.appendf("%02x", digest.data[i]); 75 md5.appendf("%02x", digest.data[i]);
(...skipping 10 matching lines...) Expand all
85 static bool write_asset(SkStreamAsset* input, SkWStream* output) { 86 static bool write_asset(SkStreamAsset* input, SkWStream* output) {
86 return input->rewind() && output->writeStream(input, input->getLength()); 87 return input->rewind() && output->writeStream(input, input->getLength());
87 } 88 }
88 89
89 static SkString get_md5(SkStreamAsset* stream) { 90 static SkString get_md5(SkStreamAsset* stream) {
90 SkMD5 hasher; 91 SkMD5 hasher;
91 write_asset(stream, &hasher); 92 write_asset(stream, &hasher);
92 return get_md5_string(&hasher); 93 return get_md5_string(&hasher);
93 } 94 }
94 95
96 static bool encode_png(const SkBitmap& src, SkFILEWStream* file) {
97 SkBitmap bm;
98 // We can't encode A8 bitmaps as PNGs. Convert them to 8888 first.
99 if (src.info().colorType() == kAlpha_8_SkColorType) {
100 if (!src.copyTo(&bm, kN32_SkColorType)) {
101 return false;
102 }
103 } else {
104 bm = src;
105 }
106 return SkImageEncoder::EncodeStream(file, bm, SkImageEncoder::kPNG_Type, 100 );
107 }
108
95 void WriteTask::draw() { 109 void WriteTask::draw() {
96 SkString md5; 110 SkString md5;
97 { 111 {
98 SkAutoLockPixels lock(fBitmap); 112 SkAutoLockPixels lock(fBitmap);
99 md5 = fData ? get_md5(fData) 113 md5 = fData ? get_md5(fData)
100 : get_md5(fBitmap.getPixels(), fBitmap.getSize()); 114 : get_md5(fBitmap.getPixels(), fBitmap.getSize());
101 } 115 }
102 116
103 SkASSERT(fSuffixes.count() > 0); 117 SkASSERT(fSuffixes.count() > 0);
104 SkString config = fSuffixes.back(); 118 SkString config = fSuffixes.back();
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 // The path is unique, so two threads can't both write to the same file. 160 // The path is unique, so two threads can't both write to the same file.
147 // If already present we overwrite here, since the content may have chan ged. 161 // If already present we overwrite here, since the content may have chan ged.
148 } 162 }
149 163
150 SkFILEWStream file(path.c_str()); 164 SkFILEWStream file(path.c_str());
151 if (!file.isValid()) { 165 if (!file.isValid()) {
152 return this->fail("Can't open file."); 166 return this->fail("Can't open file.");
153 } 167 }
154 168
155 bool ok = fData ? write_asset(fData, &file) 169 bool ok = fData ? write_asset(fData, &file)
156 : SkImageEncoder::EncodeStream(&file, fBitmap, SkImageEncode r::kPNG_Type, 100); 170 : encode_png(fBitmap, &file);
157 if (!ok) { 171 if (!ok) {
158 return this->fail("Can't write to file."); 172 return this->fail("Can't write to file.");
159 } 173 }
160 } 174 }
161 175
162 SkString WriteTask::name() const { 176 SkString WriteTask::name() const {
163 SkString name("writing "); 177 SkString name("writing ");
164 for (int i = 0; i < fSuffixes.count(); i++) { 178 for (int i = 0; i < fSuffixes.count(); i++) {
165 name.appendf("%s/", fSuffixes[i].c_str()); 179 name.appendf("%s/", fSuffixes[i].c_str());
166 } 180 }
167 name.append(fBaseName.c_str()); 181 name.append(fBaseName.c_str());
168 return name; 182 return name;
169 } 183 }
170 184
171 bool WriteTask::shouldSkip() const { 185 bool WriteTask::shouldSkip() const {
172 return FLAGS_writePath.isEmpty(); 186 return FLAGS_writePath.isEmpty();
173 } 187 }
174 188
175 } // namespace DM 189 } // namespace DM
OLDNEW
« no previous file with comments | « dm/DMImageTask.cpp ('k') | gyp/dm.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698