Index: src/image/SkImage_Raster.cpp |
diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp |
index ab37659f2f5ab41a54c353044327f08e09434c62..0316d53708aa13ecabd00c8ddc66e82b64d07daa 100644 |
--- a/src/image/SkImage_Raster.cpp |
+++ b/src/image/SkImage_Raster.cpp |
@@ -8,6 +8,7 @@ |
#include "SkImage_Base.h" |
#include "SkBitmap.h" |
#include "SkCanvas.h" |
+#include "SkColorTable.h" |
#include "SkData.h" |
#include "SkImageGeneratorPriv.h" |
#include "SkImagePriv.h" |
@@ -16,7 +17,8 @@ |
class SkImage_Raster : public SkImage_Base { |
public: |
- static bool ValidArgs(const Info& info, size_t rowBytes, size_t* minSize) { |
+ static bool ValidArgs(const Info& info, size_t rowBytes, SkColorTable* ctable, |
+ size_t* minSize) { |
const int maxDimension = SK_MaxS32 >> 2; |
if (info.width() <= 0 || info.height() <= 0) { |
@@ -36,7 +38,11 @@ public: |
return false; |
} |
- // TODO: check colorspace |
+ const bool needsCT = kIndex_8_SkColorType == info.colorType(); |
+ const bool hasCT = NULL != ctable; |
+ if (needsCT != hasCT) { |
+ return false; |
+ } |
if (rowBytes < SkImageMinRowBytes(info)) { |
return false; |
@@ -53,7 +59,7 @@ public: |
return true; |
} |
- SkImage_Raster(const SkImageInfo&, SkData*, size_t rb, const SkSurfaceProps*); |
+ SkImage_Raster(const SkImageInfo&, SkData*, size_t rb, SkColorTable*, const SkSurfaceProps*); |
virtual ~SkImage_Raster(); |
SkSurface* onNewSurface(const SkImageInfo&, const SkSurfaceProps&) const override; |
@@ -94,12 +100,11 @@ static void release_data(void* addr, void* context) { |
} |
SkImage_Raster::SkImage_Raster(const Info& info, SkData* data, size_t rowBytes, |
- const SkSurfaceProps* props) |
+ SkColorTable* ctable, const SkSurfaceProps* props) |
: INHERITED(info.width(), info.height(), props) |
{ |
data->ref(); |
void* addr = const_cast<void*>(data->data()); |
- SkColorTable* ctable = NULL; |
fBitmap.installPixels(info, addr, rowBytes, ctable, release_data, data); |
fBitmap.setImmutable(); |
@@ -161,21 +166,22 @@ bool SkImage_Raster::getROPixels(SkBitmap* dst) const { |
/////////////////////////////////////////////////////////////////////////////// |
-SkImage* SkImage::NewRasterCopy(const SkImageInfo& info, const void* pixels, size_t rowBytes) { |
+SkImage* SkImage::NewRasterCopy(const SkImageInfo& info, const void* pixels, size_t rowBytes, |
+ SkColorTable* ctable) { |
size_t size; |
- if (!SkImage_Raster::ValidArgs(info, rowBytes, &size) || !pixels) { |
+ if (!SkImage_Raster::ValidArgs(info, rowBytes, ctable, &size) || !pixels) { |
return NULL; |
} |
// Here we actually make a copy of the caller's pixel data |
SkAutoDataUnref data(SkData::NewWithCopy(pixels, size)); |
- return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, NULL)); |
+ return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, ctable, NULL)); |
} |
SkImage* SkImage::NewRasterData(const SkImageInfo& info, SkData* data, size_t rowBytes) { |
size_t size; |
- if (!SkImage_Raster::ValidArgs(info, rowBytes, &size) || !data) { |
+ if (!SkImage_Raster::ValidArgs(info, rowBytes, NULL, &size) || !data) { |
return NULL; |
} |
@@ -184,18 +190,20 @@ SkImage* SkImage::NewRasterData(const SkImageInfo& info, SkData* data, size_t ro |
return NULL; |
} |
- return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, NULL)); |
+ SkColorTable* ctable = NULL; |
+ return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, ctable, NULL)); |
} |
SkImage* SkImage::NewFromRaster(const SkImageInfo& info, const void* pixels, size_t rowBytes, |
RasterReleaseProc proc, ReleaseContext ctx) { |
size_t size; |
- if (!SkImage_Raster::ValidArgs(info, rowBytes, &size) || !pixels) { |
+ if (!SkImage_Raster::ValidArgs(info, rowBytes, NULL, &size) || !pixels) { |
return NULL; |
} |
+ SkColorTable* ctable = NULL; |
SkAutoDataUnref data(SkData::NewWithProc(pixels, size, proc, ctx)); |
- return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, NULL)); |
+ return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes, ctable, NULL)); |
} |
SkImage* SkImage::NewFromGenerator(SkImageGenerator* generator, const SkIRect* subset) { |
@@ -213,7 +221,7 @@ SkImage* SkImage::NewFromGenerator(SkImageGenerator* generator, const SkIRect* s |
SkImage* SkNewImageFromPixelRef(const SkImageInfo& info, SkPixelRef* pr, |
const SkIPoint& pixelRefOrigin, size_t rowBytes, |
const SkSurfaceProps* props) { |
- if (!SkImage_Raster::ValidArgs(info, rowBytes, NULL)) { |
+ if (!SkImage_Raster::ValidArgs(info, rowBytes, NULL, NULL)) { |
return NULL; |
} |
return SkNEW_ARGS(SkImage_Raster, (info, pr, pixelRefOrigin, rowBytes, props)); |
@@ -221,7 +229,7 @@ SkImage* SkNewImageFromPixelRef(const SkImageInfo& info, SkPixelRef* pr, |
SkImage* SkNewImageFromBitmap(const SkBitmap& bm, bool canSharePixelRef, |
const SkSurfaceProps* props) { |
- if (!SkImage_Raster::ValidArgs(bm.info(), bm.rowBytes(), NULL)) { |
+ if (!SkImage_Raster::ValidArgs(bm.info(), bm.rowBytes(), NULL, NULL)) { |
return NULL; |
} |