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

Side by Side Diff: bench/ColorCodecBench.cpp

Issue 2174493002: Add color space xform support to SkJpegCodec (includes F16!) (Closed) Base URL: https://skia.googlesource.com/skia.git@drop
Patch Set: Fix MSAN suppression Created 4 years, 4 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 | « bench/CodecBench.cpp ('k') | dm/DM.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "ColorCodecBench.h" 8 #include "ColorCodecBench.h"
9 #include "Resources.h" 9 #include "Resources.h"
10 #include "SkCodec.h" 10 #include "SkCodec.h"
(...skipping 23 matching lines...) Expand all
34 const char* ColorCodecBench::onGetName() { 34 const char* ColorCodecBench::onGetName() {
35 return fName.c_str(); 35 return fName.c_str();
36 } 36 }
37 37
38 bool ColorCodecBench::isSuitableFor(Backend backend) { 38 bool ColorCodecBench::isSuitableFor(Backend backend) {
39 return kNonRendering_Backend == backend; 39 return kNonRendering_Backend == backend;
40 } 40 }
41 41
42 void ColorCodecBench::decodeAndXform() { 42 void ColorCodecBench::decodeAndXform() {
43 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fEncoded.get())); 43 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fEncoded.get()));
44 SkASSERT(codec);
45
44 #ifdef SK_DEBUG 46 #ifdef SK_DEBUG
45 const SkCodec::Result result = 47 SkCodec::Result result =
46 #endif 48 #endif
47 codec->startScanlineDecode(fSrcInfo); 49 codec->getPixels(fDstInfo, fDst.get(), fDstInfo.minRowBytes());
48 SkASSERT(SkCodec::kSuccess == result); 50 SkASSERT(SkCodec::kSuccess == result);
49
50 sk_sp<SkColorSpace> srcSpace = sk_ref_sp(codec->getInfo().colorSpace());
51 if (!srcSpace) {
52 srcSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named);
53 }
54 std::unique_ptr<SkColorSpaceXform> xform = SkColorSpaceXform::New(srcSpace, fDstSpace);
55 SkASSERT(xform);
56
57 void* dst = fDst.get();
58 for (int y = 0; y < fSrcInfo.height(); y++) {
59 #ifdef SK_DEBUG
60 const int rows =
61 #endif
62 codec->getScanlines(fSrc.get(), 1, 0);
63 SkASSERT(1 == rows);
64
65 FLAGS_half ?
66 xform->applyToF16((uint64_t*) dst, (uint32_t*) fSrc.get(), fSrcI nfo.width()) :
67 xform->applyTo8888((SkPMColor*) dst, (uint32_t*) fSrc.get(), fSr cInfo.width());
68 dst = SkTAddOffset<void>(dst, fDstInfo.minRowBytes());
69 }
70 } 51 }
71 52
72 #if defined(SK_TEST_QCMS) 53 #if defined(SK_TEST_QCMS)
73 void ColorCodecBench::decodeAndXformQCMS() { 54 void ColorCodecBench::decodeAndXformQCMS() {
74 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fEncoded.get())); 55 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fEncoded.get()));
75 #ifdef SK_DEBUG 56 #ifdef SK_DEBUG
76 const SkCodec::Result result = 57 const SkCodec::Result result =
77 #endif 58 #endif
78 codec->startScanlineDecode(fSrcInfo); 59 codec->startScanlineDecode(fSrcInfo);
79 SkASSERT(SkCodec::kSuccess == result); 60 SkASSERT(SkCodec::kSuccess == result);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 } 95 }
115 std::unique_ptr<SkColorSpaceXform> xform = SkColorSpaceXform::New(srcSpace, fDstSpace); 96 std::unique_ptr<SkColorSpaceXform> xform = SkColorSpaceXform::New(srcSpace, fDstSpace);
116 SkASSERT(xform); 97 SkASSERT(xform);
117 98
118 void* dst = fDst.get(); 99 void* dst = fDst.get();
119 void* src = fSrc.get(); 100 void* src = fSrc.get();
120 for (int y = 0; y < fSrcInfo.height(); y++) { 101 for (int y = 0; y < fSrcInfo.height(); y++) {
121 // Transform in place 102 // Transform in place
122 FLAGS_half ? 103 FLAGS_half ?
123 xform->applyToF16((uint64_t*) dst, (uint32_t*) src, fSrcInfo.wid th()) : 104 xform->applyToF16((uint64_t*) dst, (uint32_t*) src, fSrcInfo.wid th()) :
124 xform->applyTo8888((SkPMColor*) dst, (uint32_t*) src, fSrcInfo.w idth()); 105 xform->applyToRGBA((SkPMColor*) dst, (uint32_t*) src, fSrcInfo.w idth());
125 dst = SkTAddOffset<void>(dst, fDstInfo.minRowBytes()); 106 dst = SkTAddOffset<void>(dst, fDstInfo.minRowBytes());
126 src = SkTAddOffset<void>(src, fSrcInfo.minRowBytes()); 107 src = SkTAddOffset<void>(src, fSrcInfo.minRowBytes());
127 } 108 }
128 } 109 }
129 110
130 #if defined(SK_TEST_QCMS) 111 #if defined(SK_TEST_QCMS)
131 void ColorCodecBench::xformOnlyQCMS() { 112 void ColorCodecBench::xformOnlyQCMS() {
132 SkAutoTCallVProc<qcms_profile, qcms_profile_release> 113 SkAutoTCallVProc<qcms_profile, qcms_profile_release>
133 srcSpace(qcms_profile_from_memory(fSrcData->data(), fSrcData->size() )); 114 srcSpace(qcms_profile_from_memory(fSrcData->data(), fSrcData->size() ));
134 SkASSERT(srcSpace); 115 SkASSERT(srcSpace);
(...skipping 15 matching lines...) Expand all
150 // Transform in place 131 // Transform in place
151 qcms_transform_data_type(transform, src, dst, fSrcInfo.width(), outType) ; 132 qcms_transform_data_type(transform, src, dst, fSrcInfo.width(), outType) ;
152 dst = SkTAddOffset<void>(dst, fDstInfo.minRowBytes()); 133 dst = SkTAddOffset<void>(dst, fDstInfo.minRowBytes());
153 src = SkTAddOffset<void>(src, fSrcInfo.minRowBytes()); 134 src = SkTAddOffset<void>(src, fSrcInfo.minRowBytes());
154 } 135 }
155 } 136 }
156 #endif 137 #endif
157 138
158 void ColorCodecBench::onDelayedSetup() { 139 void ColorCodecBench::onDelayedSetup() {
159 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fEncoded.get())); 140 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fEncoded.get()));
160 fSrcInfo = codec->getInfo().makeColorType(kRGBA_8888_SkColorType);
161
162 fDstInfo = fSrcInfo;
163 if (FLAGS_half) {
164 fDstInfo = fDstInfo.makeColorType(kRGBA_F16_SkColorType);
165 }
166 fDst.reset(fDstInfo.getSafeSize(fDstInfo.minRowBytes()));
167
168 if (FLAGS_xform_only) {
169 fSrc.reset(fSrcInfo.getSafeSize(fSrcInfo.minRowBytes()));
170 codec->getPixels(fSrcInfo, fSrc.get(), fSrcInfo.minRowBytes());
171 } else {
172 // Set-up a row buffer to decode into before transforming to dst.
173 fSrc.reset(fSrcInfo.minRowBytes());
174 }
175
176 fSrcData = codec->getICCData(); 141 fSrcData = codec->getICCData();
177 sk_sp<SkData> dstData = SkData::MakeFromFileName( 142 sk_sp<SkData> dstData = SkData::MakeFromFileName(
178 GetResourcePath("monitor_profiles/HP_ZR30w.icc").c_str()); 143 GetResourcePath("monitor_profiles/HP_ZR30w.icc").c_str());
179 SkASSERT(dstData); 144 SkASSERT(dstData);
180 145
181 146 fDstSpace = nullptr;
182 #if defined(SK_TEST_QCMS) 147 #if defined(SK_TEST_QCMS)
183 if (FLAGS_qcms) { 148 if (FLAGS_qcms) {
184 fDstSpaceQCMS.reset(FLAGS_srgb ? 149 fDstSpaceQCMS.reset(FLAGS_srgb ?
185 qcms_profile_sRGB() : 150 qcms_profile_sRGB() :
186 qcms_profile_from_memory(dstData->data(), dstData->size())); 151 qcms_profile_from_memory(dstData->data(), dstData->size()));
187 SkASSERT(fDstSpaceQCMS); 152 SkASSERT(fDstSpaceQCMS);
188 153
189 // This call takes a non-trivial amount of time, but I think it's the mo st fair to 154 // This call takes a non-trivial amount of time, but I think it's the mo st fair to
190 // treat it as overhead. It only needs to happen once. 155 // treat it as overhead. It only needs to happen once.
191 qcms_profile_precache_output_transform(fDstSpaceQCMS); 156 qcms_profile_precache_output_transform(fDstSpaceQCMS);
192 } else 157 } else
193 #endif 158 #endif
194 { 159 {
195 fDstSpace = FLAGS_srgb ? SkColorSpace::NewNamed(SkColorSpace::kSRGB_Name d) : 160 fDstSpace = FLAGS_srgb ? SkColorSpace::NewNamed(SkColorSpace::kSRGB_Name d) :
196 SkColorSpace::NewICC(dstData->data(), dstData-> size()); 161 SkColorSpace::NewICC(dstData->data(), dstData-> size());
197 SkASSERT(fDstSpace); 162 SkASSERT(fDstSpace);
198 } 163 }
164
165 fSrcInfo = codec->getInfo().makeColorType(kRGBA_8888_SkColorType);
166
167 fDstInfo = fSrcInfo.makeColorSpace(fDstSpace);
168 if (FLAGS_half) {
169 fDstInfo = fDstInfo.makeColorType(kRGBA_F16_SkColorType);
170 }
171 fDst.reset(fDstInfo.getSafeSize(fDstInfo.minRowBytes()));
172
173 if (FLAGS_xform_only) {
174 fSrc.reset(fSrcInfo.getSafeSize(fSrcInfo.minRowBytes()));
175 codec->getPixels(fSrcInfo, fSrc.get(), fSrcInfo.minRowBytes());
176 }
177 #if defined(SK_TEST_QCMS)
178 else if (FLAGS_qcms) {
179 // Set-up a row buffer to decode into before transforming to dst.
180 fSrc.reset(fSrcInfo.minRowBytes());
181 }
182 #endif
199 } 183 }
200 184
201 void ColorCodecBench::onDraw(int n, SkCanvas*) { 185 void ColorCodecBench::onDraw(int n, SkCanvas*) {
202 #if defined(SK_TEST_QCMS) 186 #if defined(SK_TEST_QCMS)
203 bool to8888 = FLAGS_srgb || FLAGS_qcms; 187 bool to8888 = FLAGS_srgb || FLAGS_qcms;
204 #else 188 #else
205 bool to8888 = FLAGS_srgb; 189 bool to8888 = FLAGS_srgb;
206 #endif 190 #endif
207 if (to8888 && FLAGS_half) { 191 if (to8888 && FLAGS_half) {
208 SkDebugf("Error: Contradicting flags.\n"); 192 SkDebugf("Error: Contradicting flags.\n");
(...skipping 12 matching lines...) Expand all
221 #endif 205 #endif
222 { 206 {
223 if (FLAGS_xform_only) { 207 if (FLAGS_xform_only) {
224 this->xformOnly(); 208 this->xformOnly();
225 } else { 209 } else {
226 this->decodeAndXform(); 210 this->decodeAndXform();
227 } 211 }
228 } 212 }
229 } 213 }
230 } 214 }
OLDNEW
« no previous file with comments | « bench/CodecBench.cpp ('k') | dm/DM.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698