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

Side by Side Diff: dm/DMWriteTask.cpp

Issue 560453002: Back to hashing source content, not .png. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Remove test Created 6 years, 3 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 | « no previous file | gyp/tests.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 "DMUtil.h" 3 #include "DMUtil.h"
4 #include "SkColorPriv.h" 4 #include "SkColorPriv.h"
5 #include "SkCommonFlags.h" 5 #include "SkCommonFlags.h"
6 #include "SkData.h" 6 #include "SkData.h"
7 #include "SkImageEncoder.h" 7 #include "SkImageEncoder.h"
8 #include "SkMD5.h" 8 #include "SkMD5.h"
9 #include "SkMallocPixelRef.h" 9 #include "SkMallocPixelRef.h"
10 #include "SkOSFile.h" 10 #include "SkOSFile.h"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 SkASSERT(fData.get()); 57 SkASSERT(fData.get());
58 SkASSERT(fData->unique()); 58 SkASSERT(fData->unique());
59 } 59 }
60 60
61 void WriteTask::makeDirOrFail(SkString dir) { 61 void WriteTask::makeDirOrFail(SkString dir) {
62 if (!sk_mkdir(dir.c_str())) { 62 if (!sk_mkdir(dir.c_str())) {
63 this->fail(); 63 this->fail();
64 } 64 }
65 } 65 }
66 66
67 static SkStreamAsset* encode_to_png(const SkBitmap& bitmap) { 67 static SkString get_md5(const void* ptr, size_t len) {
68 SkDynamicMemoryWStream png;
69 if (!SkImageEncoder::EncodeStream(&png, bitmap, SkImageEncoder::kPNG_Type, 1 00)) {
70 return NULL;
71 }
72 png.copyToData()->unref(); // Forces detachAsStream() to be contiguous.
73 return png.detachAsStream();
74 }
75
76 static SkString get_md5(SkStreamAsset* src) {
77 SkMD5 hasher; 68 SkMD5 hasher;
78 hasher.write(src->getMemoryBase(), src->getLength()); 69 hasher.write(ptr, len);
79 SkMD5::Digest digest; 70 SkMD5::Digest digest;
80 hasher.finish(digest); 71 hasher.finish(digest);
81 72
82 SkString md5; 73 SkString md5;
83 for (int i = 0; i < 16; i++) { 74 for (int i = 0; i < 16; i++) {
84 md5.appendf("%02x", digest.data[i]); 75 md5.appendf("%02x", digest.data[i]);
85 } 76 }
86 return md5; 77 return md5;
87 } 78 }
88 79
89 struct JsonData { 80 struct JsonData {
90 SkString name; // E.g. "ninepatch-stretch", "desk-gws_skp" 81 SkString name; // E.g. "ninepatch-stretch", "desk-gws_skp"
91 SkString config; // "gpu", "8888" 82 SkString config; // "gpu", "8888"
92 SkString sourceType; // "GM", "SKP" 83 SkString sourceType; // "GM", "SKP"
93 SkString md5; // In ASCII, so 32 bytes long. 84 SkString md5; // In ASCII, so 32 bytes long.
94 }; 85 };
95 SkTArray<JsonData> gJsonData; 86 SkTArray<JsonData> gJsonData;
96 SK_DECLARE_STATIC_MUTEX(gJsonDataLock); 87 SK_DECLARE_STATIC_MUTEX(gJsonDataLock);
97 88
98 void WriteTask::draw() { 89 void WriteTask::draw() {
99 if (!fData.get()) { 90 SkString md5;
100 fData.reset(encode_to_png(fBitmap)); 91 {
101 if (!fData.get()) { 92 SkAutoLockPixels lock(fBitmap);
102 this->fail("Can't encode to PNG."); 93 md5 = fData ? get_md5(fData->getMemoryBase(), fData->getLength())
103 } 94 : get_md5(fBitmap.getPixels(), fBitmap.getSize());
104 } 95 }
105 96
106 JsonData entry = { fBaseName, fSuffixes[0], fSourceType, get_md5(fData) }; 97 JsonData entry = { fBaseName, fSuffixes[0], fSourceType, md5 };
107 { 98 {
108 SkAutoMutexAcquire lock(&gJsonDataLock); 99 SkAutoMutexAcquire lock(&gJsonDataLock);
109 gJsonData.push_back(entry); 100 gJsonData.push_back(entry);
110 } 101 }
111 102
112 SkString dir(FLAGS_writePath[0]); 103 SkString dir(FLAGS_writePath[0]);
113 #if SK_BUILD_FOR_IOS 104 #if SK_BUILD_FOR_IOS
114 if (dir.equals("@")) { 105 if (dir.equals("@")) {
115 dir.set(FLAGS_resourcePath[0]); 106 dir.set(FLAGS_resourcePath[0]);
116 } 107 }
117 #endif 108 #endif
118 this->makeDirOrFail(dir); 109 this->makeDirOrFail(dir);
119 110
120 SkString path; 111 SkString path;
121 if (FLAGS_nameByHash) { 112 if (FLAGS_nameByHash) {
122 // Flat directory of hash-named files. 113 // Flat directory of hash-named files.
123 path = SkOSPath::Join(dir.c_str(), entry.md5.c_str()); 114 path = SkOSPath::Join(dir.c_str(), md5.c_str());
124 path.append(fExtension); 115 path.append(fExtension);
125 // We're content-addressed, so it's possible two threads race to write 116 // We're content-addressed, so it's possible two threads race to write
126 // this file. We let the first one win. This also means we won't 117 // this file. We let the first one win. This also means we won't
127 // overwrite identical files from previous runs. 118 // overwrite identical files from previous runs.
128 if (sk_exists(path.c_str())) { 119 if (sk_exists(path.c_str())) {
129 return; 120 return;
130 } 121 }
131 } else { 122 } else {
132 // Nested by mode, config, etc. 123 // Nested by mode, config, etc.
133 for (int i = 0; i < fSuffixes.count(); i++) { 124 for (int i = 0; i < fSuffixes.count(); i++) {
134 dir = SkOSPath::Join(dir.c_str(), fSuffixes[i].c_str()); 125 dir = SkOSPath::Join(dir.c_str(), fSuffixes[i].c_str());
135 this->makeDirOrFail(dir); 126 this->makeDirOrFail(dir);
136 } 127 }
137 path = SkOSPath::Join(dir.c_str(), fBaseName.c_str()); 128 path = SkOSPath::Join(dir.c_str(), fBaseName.c_str());
138 path.append(fExtension); 129 path.append(fExtension);
139 // The path is unique, so two threads can't both write to the same file. 130 // The path is unique, so two threads can't both write to the same file.
140 // If already present we overwrite here, since the content may have chan ged. 131 // If already present we overwrite here, since the content may have chan ged.
141 } 132 }
142 133
143 SkFILEWStream file(path.c_str()); 134 SkFILEWStream file(path.c_str());
144 if (!file.isValid()) { 135 if (!file.isValid()) {
145 return this->fail("Can't open file."); 136 return this->fail("Can't open file.");
146 } 137 }
147 138
148 fData->rewind(); 139 bool ok = fData ? file.writeStream(fData, fData->getLength())
149 if (!file.writeStream(fData, fData->getLength())) { 140 : SkImageEncoder::EncodeStream(&file, fBitmap, SkImageEncode r::kPNG_Type, 100);
141 if (!ok) {
150 return this->fail("Can't write to file."); 142 return this->fail("Can't write to file.");
151 } 143 }
152 } 144 }
153 145
154 SkString WriteTask::name() const { 146 SkString WriteTask::name() const {
155 SkString name("writing "); 147 SkString name("writing ");
156 for (int i = 0; i < fSuffixes.count(); i++) { 148 for (int i = 0; i < fSuffixes.count(); i++) {
157 name.appendf("%s/", fSuffixes[i].c_str()); 149 name.appendf("%s/", fSuffixes[i].c_str());
158 } 150 }
159 name.append(fBaseName.c_str()); 151 name.append(fBaseName.c_str());
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 } 183 }
192 } 184 }
193 185
194 SkString path = SkOSPath::Join(FLAGS_writePath[0], "dm.json"); 186 SkString path = SkOSPath::Join(FLAGS_writePath[0], "dm.json");
195 SkFILEWStream stream(path.c_str()); 187 SkFILEWStream stream(path.c_str());
196 stream.writeText(Json::StyledWriter().write(root).c_str()); 188 stream.writeText(Json::StyledWriter().write(root).c_str());
197 stream.flush(); 189 stream.flush();
198 } 190 }
199 191
200 } // namespace DM 192 } // namespace DM
OLDNEW
« no previous file with comments | « no previous file | gyp/tests.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698