OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |