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

Side by Side Diff: dm/DMWriteTask.cpp

Issue 171723007: add new copyTo version to SkBitmap, which takes SkColorType (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 6 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | gm/bitmapcopy.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 #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 "SkCommandLineFlags.h" 5 #include "SkCommandLineFlags.h"
6 #include "SkImageDecoder.h" 6 #include "SkImageDecoder.h"
7 #include "SkImageEncoder.h" 7 #include "SkImageEncoder.h"
8 #include "SkString.h" 8 #include "SkString.h"
9 #include "SkUnPreMultiply.h" 9 #include "SkUnPreMultiply.h"
10 10
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 SkDebugf("Could not read %s.\n", path.c_str()); 106 SkDebugf("Could not read %s.\n", path.c_str());
107 return false; 107 return false;
108 } 108 }
109 109
110 SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(stream)); 110 SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(stream));
111 if (NULL == decoder.get()) { 111 if (NULL == decoder.get()) {
112 SkDebugf("Could not find a decoder for %s.\n", path.c_str()); 112 SkDebugf("Could not find a decoder for %s.\n", path.c_str());
113 return false; 113 return false;
114 } 114 }
115 115
116 SkImageInfo info; 116 const SkImageInfo info = bitmap.info();
117 SkAssertResult(bitmap.asImageInfo(&info));
118 117
119 SkBitmap expected; 118 SkBitmap expected;
120 expected.setConfig(info); 119 expected.allocPixels(info);
121 expected.allocPixels();
122 120
123 // expected will be unpremultiplied. 121 // expected will be unpremultiplied.
124 decoder->setRequireUnpremultipliedColors(true); 122 decoder->setRequireUnpremultipliedColors(true);
125 if (!decoder->decode(stream, &expected, SkImageDecoder::kDecodePixels_Mode)) { 123 if (!decoder->decode(stream, &expected, SkImageDecoder::kDecodePixels_Mode)) {
126 SkDebugf("Could not decode %s.\n", path.c_str()); 124 SkDebugf("Could not decode %s.\n", path.c_str());
127 return false; 125 return false;
128 } 126 }
129 127
130 // We always seem to decode to 8888. This puts 565 back in 565. 128 // We always seem to decode to 8888. This puts 565 back in 565.
131 if (expected.config() != bitmap.config()) { 129 if (expected.colorType() != bitmap.colorType()) {
132 SkBitmap converted; 130 SkBitmap converted;
133 SkAssertResult(expected.copyTo(&converted, bitmap.config())); 131 SkAssertResult(expected.copyTo(&converted, bitmap.colorType()));
134 expected.swap(converted); 132 expected.swap(converted);
135 } 133 }
136 SkASSERT(expected.config() == bitmap.config()); 134 SkASSERT(expected.config() == bitmap.config());
137 135
138 // Manually unpremultiply 8888 bitmaps to match expected. 136 // Manually unpremultiply 8888 bitmaps to match expected.
139 // Their pixels are shared, concurrently even, so we must copy them. 137 // Their pixels are shared, concurrently even, so we must copy them.
140 if (info.fColorType == kPMColor_SkColorType) { 138 if (info.colorType() == kPMColor_SkColorType) {
141 SkBitmap unpremul; 139 SkBitmap unpremul;
142 unpremul.setConfig(info); 140 unpremul.allocPixels(info);
143 unpremul.allocPixels();
144 141
145 SkAutoLockPixels lockSrc(bitmap), lockDst(unpremul); 142 SkAutoLockPixels lockSrc(bitmap), lockDst(unpremul);
146 const SkPMColor* src = (SkPMColor*)bitmap.getPixels(); 143 const SkPMColor* src = (SkPMColor*)bitmap.getPixels();
147 uint32_t* dst = (uint32_t*)unpremul.getPixels(); 144 uint32_t* dst = (uint32_t*)unpremul.getPixels();
148 for (size_t i = 0; i < bitmap.getSize()/4; i++) { 145 for (size_t i = 0; i < bitmap.getSize()/4; i++) {
149 dst[i] = SkUnPreMultiply::UnPreMultiplyPreservingByteOrder(src[i]); 146 dst[i] = SkUnPreMultiply::UnPreMultiplyPreservingByteOrder(src[i]);
150 } 147 }
151 bitmap.swap(unpremul); 148 bitmap.swap(unpremul);
152 } 149 }
153 150
154 return BitmapsEqual(expected, bitmap); 151 return BitmapsEqual(expected, bitmap);
155 } 152 }
156 153
157 } // namespace DM 154 } // namespace DM
OLDNEW
« no previous file with comments | « no previous file | gm/bitmapcopy.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698