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

Side by Side Diff: src/image/SkImage_Raster.cpp

Issue 1222683004: add colortable param to newrastercopy (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: add test Created 5 years, 5 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 | « src/image/SkImagePriv.h ('k') | tests/ImageTest.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 2012 Google Inc. 2 * Copyright 2012 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 "SkImage_Base.h" 8 #include "SkImage_Base.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkCanvas.h" 10 #include "SkCanvas.h"
11 #include "SkColorTable.h"
11 #include "SkData.h" 12 #include "SkData.h"
12 #include "SkImageGeneratorPriv.h" 13 #include "SkImageGeneratorPriv.h"
13 #include "SkImagePriv.h" 14 #include "SkImagePriv.h"
14 #include "SkPixelRef.h" 15 #include "SkPixelRef.h"
15 #include "SkSurface.h" 16 #include "SkSurface.h"
16 17
17 class SkImage_Raster : public SkImage_Base { 18 class SkImage_Raster : public SkImage_Base {
18 public: 19 public:
19 static bool ValidArgs(const Info& info, size_t rowBytes, size_t* minSize) { 20 static bool ValidArgs(const Info& info, size_t rowBytes, SkColorTable* ctabl e,
21 size_t* minSize) {
20 const int maxDimension = SK_MaxS32 >> 2; 22 const int maxDimension = SK_MaxS32 >> 2;
21 23
22 if (info.width() <= 0 || info.height() <= 0) { 24 if (info.width() <= 0 || info.height() <= 0) {
23 return false; 25 return false;
24 } 26 }
25 if (info.width() > maxDimension || info.height() > maxDimension) { 27 if (info.width() > maxDimension || info.height() > maxDimension) {
26 return false; 28 return false;
27 } 29 }
28 if ((unsigned)info.colorType() > (unsigned)kLastEnum_SkColorType) { 30 if ((unsigned)info.colorType() > (unsigned)kLastEnum_SkColorType) {
29 return false; 31 return false;
30 } 32 }
31 if ((unsigned)info.alphaType() > (unsigned)kLastEnum_SkAlphaType) { 33 if ((unsigned)info.alphaType() > (unsigned)kLastEnum_SkAlphaType) {
32 return false; 34 return false;
33 } 35 }
34 36
35 if (kUnknown_SkColorType == info.colorType()) { 37 if (kUnknown_SkColorType == info.colorType()) {
36 return false; 38 return false;
37 } 39 }
38 40
39 // TODO: check colorspace 41 const bool needsCT = kIndex_8_SkColorType == info.colorType();
42 const bool hasCT = NULL != ctable;
43 if (needsCT != hasCT) {
44 return false;
45 }
40 46
41 if (rowBytes < SkImageMinRowBytes(info)) { 47 if (rowBytes < SkImageMinRowBytes(info)) {
42 return false; 48 return false;
43 } 49 }
44 50
45 size_t size = info.getSafeSize(rowBytes); 51 size_t size = info.getSafeSize(rowBytes);
46 if (0 == size) { 52 if (0 == size) {
47 return false; 53 return false;
48 } 54 }
49 55
50 if (minSize) { 56 if (minSize) {
51 *minSize = size; 57 *minSize = size;
52 } 58 }
53 return true; 59 return true;
54 } 60 }
55 61
56 SkImage_Raster(const SkImageInfo&, SkData*, size_t rb, const SkSurfaceProps* ); 62 SkImage_Raster(const SkImageInfo&, SkData*, size_t rb, SkColorTable*, const SkSurfaceProps*);
57 virtual ~SkImage_Raster(); 63 virtual ~SkImage_Raster();
58 64
59 SkSurface* onNewSurface(const SkImageInfo&, const SkSurfaceProps&) const ove rride; 65 SkSurface* onNewSurface(const SkImageInfo&, const SkSurfaceProps&) const ove rride;
60 bool onReadPixels(const SkImageInfo&, void*, size_t, int srcX, int srcY) con st override; 66 bool onReadPixels(const SkImageInfo&, void*, size_t, int srcX, int srcY) con st override;
61 const void* onPeekPixels(SkImageInfo*, size_t* /*rowBytes*/) const override; 67 const void* onPeekPixels(SkImageInfo*, size_t* /*rowBytes*/) const override;
62 SkData* onRefEncoded() const override; 68 SkData* onRefEncoded() const override;
63 bool getROPixels(SkBitmap*) const override; 69 bool getROPixels(SkBitmap*) const override;
64 70
65 // exposed for SkSurface_Raster via SkNewImageFromPixelRef 71 // exposed for SkSurface_Raster via SkNewImageFromPixelRef
66 SkImage_Raster(const SkImageInfo&, SkPixelRef*, const SkIPoint& pixelRefOrig in, size_t rowBytes, 72 SkImage_Raster(const SkImageInfo&, SkPixelRef*, const SkIPoint& pixelRefOrig in, size_t rowBytes,
(...skipping 20 matching lines...) Expand all
87 }; 93 };
88 94
89 /////////////////////////////////////////////////////////////////////////////// 95 ///////////////////////////////////////////////////////////////////////////////
90 96
91 static void release_data(void* addr, void* context) { 97 static void release_data(void* addr, void* context) {
92 SkData* data = static_cast<SkData*>(context); 98 SkData* data = static_cast<SkData*>(context);
93 data->unref(); 99 data->unref();
94 } 100 }
95 101
96 SkImage_Raster::SkImage_Raster(const Info& info, SkData* data, size_t rowBytes, 102 SkImage_Raster::SkImage_Raster(const Info& info, SkData* data, size_t rowBytes,
97 const SkSurfaceProps* props) 103 SkColorTable* ctable, const SkSurfaceProps* props )
98 : INHERITED(info.width(), info.height(), props) 104 : INHERITED(info.width(), info.height(), props)
99 { 105 {
100 data->ref(); 106 data->ref();
101 void* addr = const_cast<void*>(data->data()); 107 void* addr = const_cast<void*>(data->data());
102 SkColorTable* ctable = NULL;
103 108
104 fBitmap.installPixels(info, addr, rowBytes, ctable, release_data, data); 109 fBitmap.installPixels(info, addr, rowBytes, ctable, release_data, data);
105 fBitmap.setImmutable(); 110 fBitmap.setImmutable();
106 fBitmap.lockPixels(); 111 fBitmap.lockPixels();
107 } 112 }
108 113
109 SkImage_Raster::SkImage_Raster(const Info& info, SkPixelRef* pr, const SkIPoint& pixelRefOrigin, 114 SkImage_Raster::SkImage_Raster(const Info& info, SkPixelRef* pr, const SkIPoint& pixelRefOrigin,
110 size_t rowBytes, const SkSurfaceProps* props) 115 size_t rowBytes, const SkSurfaceProps* props)
111 : INHERITED(info.width(), info.height(), props) 116 : INHERITED(info.width(), info.height(), props)
112 { 117 {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 return NULL; 159 return NULL;
155 } 160 }
156 161
157 bool SkImage_Raster::getROPixels(SkBitmap* dst) const { 162 bool SkImage_Raster::getROPixels(SkBitmap* dst) const {
158 *dst = fBitmap; 163 *dst = fBitmap;
159 return true; 164 return true;
160 } 165 }
161 166
162 /////////////////////////////////////////////////////////////////////////////// 167 ///////////////////////////////////////////////////////////////////////////////
163 168
164 SkImage* SkImage::NewRasterCopy(const SkImageInfo& info, const void* pixels, siz e_t rowBytes) { 169 SkImage* SkImage::NewRasterCopy(const SkImageInfo& info, const void* pixels, siz e_t rowBytes,
170 SkColorTable* ctable) {
165 size_t size; 171 size_t size;
166 if (!SkImage_Raster::ValidArgs(info, rowBytes, &size) || !pixels) { 172 if (!SkImage_Raster::ValidArgs(info, rowBytes, ctable, &size) || !pixels) {
167 return NULL; 173 return NULL;
168 } 174 }
169 175
170 // Here we actually make a copy of the caller's pixel data 176 // Here we actually make a copy of the caller's pixel data
171 SkAutoDataUnref data(SkData::NewWithCopy(pixels, size)); 177 SkAutoDataUnref data(SkData::NewWithCopy(pixels, size));
172 return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, NULL)); 178 return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, ctable, NULL));
173 } 179 }
174 180
175 181
176 SkImage* SkImage::NewRasterData(const SkImageInfo& info, SkData* data, size_t ro wBytes) { 182 SkImage* SkImage::NewRasterData(const SkImageInfo& info, SkData* data, size_t ro wBytes) {
177 size_t size; 183 size_t size;
178 if (!SkImage_Raster::ValidArgs(info, rowBytes, &size) || !data) { 184 if (!SkImage_Raster::ValidArgs(info, rowBytes, NULL, &size) || !data) {
179 return NULL; 185 return NULL;
180 } 186 }
181 187
182 // did they give us enough data? 188 // did they give us enough data?
183 if (data->size() < size) { 189 if (data->size() < size) {
184 return NULL; 190 return NULL;
185 } 191 }
186 192
187 return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, NULL)); 193 SkColorTable* ctable = NULL;
194 return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, ctable, NULL));
188 } 195 }
189 196
190 SkImage* SkImage::NewFromRaster(const SkImageInfo& info, const void* pixels, siz e_t rowBytes, 197 SkImage* SkImage::NewFromRaster(const SkImageInfo& info, const void* pixels, siz e_t rowBytes,
191 RasterReleaseProc proc, ReleaseContext ctx) { 198 RasterReleaseProc proc, ReleaseContext ctx) {
192 size_t size; 199 size_t size;
193 if (!SkImage_Raster::ValidArgs(info, rowBytes, &size) || !pixels) { 200 if (!SkImage_Raster::ValidArgs(info, rowBytes, NULL, &size) || !pixels) {
194 return NULL; 201 return NULL;
195 } 202 }
196 203
204 SkColorTable* ctable = NULL;
197 SkAutoDataUnref data(SkData::NewWithProc(pixels, size, proc, ctx)); 205 SkAutoDataUnref data(SkData::NewWithProc(pixels, size, proc, ctx));
198 return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, NULL)); 206 return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, ctable, NULL));
199 } 207 }
200 208
201 SkImage* SkImage::NewFromGenerator(SkImageGenerator* generator, const SkIRect* s ubset) { 209 SkImage* SkImage::NewFromGenerator(SkImageGenerator* generator, const SkIRect* s ubset) {
202 SkBitmap bitmap; 210 SkBitmap bitmap;
203 if (!SkInstallDiscardablePixelRef(generator, subset, &bitmap, NULL)) { 211 if (!SkInstallDiscardablePixelRef(generator, subset, &bitmap, NULL)) {
204 return NULL; 212 return NULL;
205 } 213 }
206 if (0 == bitmap.width() || 0 == bitmap.height()) { 214 if (0 == bitmap.width() || 0 == bitmap.height()) {
207 return NULL; 215 return NULL;
208 } 216 }
209 217
210 return SkNEW_ARGS(SkImage_Raster, (bitmap, NULL)); 218 return SkNEW_ARGS(SkImage_Raster, (bitmap, NULL));
211 } 219 }
212 220
213 SkImage* SkNewImageFromPixelRef(const SkImageInfo& info, SkPixelRef* pr, 221 SkImage* SkNewImageFromPixelRef(const SkImageInfo& info, SkPixelRef* pr,
214 const SkIPoint& pixelRefOrigin, size_t rowBytes, 222 const SkIPoint& pixelRefOrigin, size_t rowBytes,
215 const SkSurfaceProps* props) { 223 const SkSurfaceProps* props) {
216 if (!SkImage_Raster::ValidArgs(info, rowBytes, NULL)) { 224 if (!SkImage_Raster::ValidArgs(info, rowBytes, NULL, NULL)) {
217 return NULL; 225 return NULL;
218 } 226 }
219 return SkNEW_ARGS(SkImage_Raster, (info, pr, pixelRefOrigin, rowBytes, props )); 227 return SkNEW_ARGS(SkImage_Raster, (info, pr, pixelRefOrigin, rowBytes, props ));
220 } 228 }
221 229
222 SkImage* SkNewImageFromBitmap(const SkBitmap& bm, bool canSharePixelRef, 230 SkImage* SkNewImageFromBitmap(const SkBitmap& bm, bool canSharePixelRef,
223 const SkSurfaceProps* props) { 231 const SkSurfaceProps* props) {
224 if (!SkImage_Raster::ValidArgs(bm.info(), bm.rowBytes(), NULL)) { 232 if (!SkImage_Raster::ValidArgs(bm.info(), bm.rowBytes(), NULL, NULL)) {
225 return NULL; 233 return NULL;
226 } 234 }
227 235
228 SkImage* image = NULL; 236 SkImage* image = NULL;
229 if (canSharePixelRef || bm.isImmutable()) { 237 if (canSharePixelRef || bm.isImmutable()) {
230 image = SkNEW_ARGS(SkImage_Raster, (bm, props)); 238 image = SkNEW_ARGS(SkImage_Raster, (bm, props));
231 } else { 239 } else {
232 bm.lockPixels(); 240 bm.lockPixels();
233 if (bm.getPixels()) { 241 if (bm.getPixels()) {
234 image = SkImage::NewRasterCopy(bm.info(), bm.getPixels(), bm.rowByte s()); 242 image = SkImage::NewRasterCopy(bm.info(), bm.getPixels(), bm.rowByte s());
235 } 243 }
236 bm.unlockPixels(); 244 bm.unlockPixels();
237 245
238 // we don't expose props to NewRasterCopy (need a private vers) so post- init it here 246 // we don't expose props to NewRasterCopy (need a private vers) so post- init it here
239 if (image && props) { 247 if (image && props) {
240 as_IB(image)->initWithProps(*props); 248 as_IB(image)->initWithProps(*props);
241 } 249 }
242 } 250 }
243 return image; 251 return image;
244 } 252 }
245 253
246 const SkPixelRef* SkBitmapImageGetPixelRef(const SkImage* image) { 254 const SkPixelRef* SkBitmapImageGetPixelRef(const SkImage* image) {
247 return ((const SkImage_Raster*)image)->getPixelRef(); 255 return ((const SkImage_Raster*)image)->getPixelRef();
248 } 256 }
249 257
250 bool SkImage_Raster::isOpaque() const { 258 bool SkImage_Raster::isOpaque() const {
251 return fBitmap.isOpaque(); 259 return fBitmap.isOpaque();
252 } 260 }
253 261
OLDNEW
« no previous file with comments | « src/image/SkImagePriv.h ('k') | tests/ImageTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698