| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |