| 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 |