Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / image / SkImage_Raster.cpp
index 32d53fc..18d6a8c 100644 (file)
@@ -10,7 +10,7 @@
 #include "SkBitmap.h"
 #include "SkCanvas.h"
 #include "SkData.h"
-#include "SkMallocPixelRef.h"
+#include "SkDecodingImageGenerator.h"
 
 class SkImage_Raster : public SkImage_Base {
 public:
@@ -18,20 +18,20 @@ public:
         const int maxDimension = SK_MaxS32 >> 2;
         const size_t kMaxPixelByteSize = SK_MaxS32;
 
-        if (info.fWidth < 0 || info.fHeight < 0) {
+        if (info.width() < 0 || info.height() < 0) {
             return false;
         }
-        if (info.fWidth > maxDimension || info.fHeight > maxDimension) {
+        if (info.width() > maxDimension || info.height() > maxDimension) {
             return false;
         }
-        if ((unsigned)info.fColorType > (unsigned)kLastEnum_SkColorType) {
+        if ((unsigned)info.colorType() > (unsigned)kLastEnum_SkColorType) {
             return false;
         }
-        if ((unsigned)info.fAlphaType > (unsigned)kLastEnum_SkAlphaType) {
+        if ((unsigned)info.alphaType() > (unsigned)kLastEnum_SkAlphaType) {
             return false;
         }
 
-        if (SkImageInfoToBitmapConfig(info) == SkBitmap::kNo_Config) {
+        if (kUnknown_SkColorType == info.colorType()) {
             return false;
         }
 
@@ -41,7 +41,7 @@ public:
             return false;
         }
 
-        int64_t size = (int64_t)info.fHeight * rowBytes;
+        int64_t size = (int64_t)info.height() * rowBytes;
         if (size > (int64_t)kMaxPixelByteSize) {
             return false;
         }
@@ -53,8 +53,11 @@ public:
     SkImage_Raster(const SkImageInfo&, SkData*, size_t rb);
     virtual ~SkImage_Raster();
 
-    virtual void onDraw(SkCanvas*, SkScalar, SkScalar, const SkPaint*) SK_OVERRIDE;
-    virtual void onDrawRectToRect(SkCanvas*, const SkRect*, const SkRect&, const SkPaint*) SK_OVERRIDE;
+    virtual void onDraw(SkCanvas*, SkScalar, SkScalar, const SkPaint*) const SK_OVERRIDE;
+    virtual void onDrawRect(SkCanvas*, const SkRect*, const SkRect&,
+                                  const SkPaint*) const SK_OVERRIDE;
+    virtual bool onReadPixels(SkBitmap*, const SkIRect&) const SK_OVERRIDE;
+    virtual const void* onPeekPixels(SkImageInfo*, size_t* /*rowBytes*/) const SK_OVERRIDE;
     virtual bool getROPixels(SkBitmap*) const SK_OVERRIDE;
 
     // exposed for SkSurface_Raster via SkNewImageFromPixelRef
@@ -62,6 +65,16 @@ public:
 
     SkPixelRef* getPixelRef() const { return fBitmap.pixelRef(); }
 
+    virtual SkShader* onNewShader(SkShader::TileMode,
+                                  SkShader::TileMode,
+                                  const SkMatrix* localMatrix) const SK_OVERRIDE;
+
+    virtual bool isOpaque() const SK_OVERRIDE;
+
+    SkImage_Raster(const SkBitmap& bm)
+        : INHERITED(bm.width(), bm.height())
+        , fBitmap(bm) {}
+
 private:
     SkImage_Raster() : INHERITED(0, 0) {}
 
@@ -82,32 +95,69 @@ SkImage* SkImage_Raster::NewEmpty() {
     return gEmpty;
 }
 
+static void release_data(void* addr, void* context) {
+    SkData* data = static_cast<SkData*>(context);
+    data->unref();
+}
+
 SkImage_Raster::SkImage_Raster(const Info& info, SkData* data, size_t rowBytes)
-        : INHERITED(info.fWidth, info.fHeight) {
-    fBitmap.setConfig(info, rowBytes);
-    SkAutoTUnref<SkPixelRef> ref(
-        SkMallocPixelRef::NewWithData(info, rowBytes, NULL, data, 0));
-    fBitmap.setPixelRef(ref);
+    : INHERITED(info.width(), info.height())
+{
+    data->ref();
+    void* addr = const_cast<void*>(data->data());
+    SkColorTable* ctable = NULL;
+
+    fBitmap.installPixels(info, addr, rowBytes, ctable, release_data, data);
     fBitmap.setImmutable();
+    fBitmap.lockPixels();
 }
 
 SkImage_Raster::SkImage_Raster(const Info& info, SkPixelRef* pr, size_t rowBytes)
-    : INHERITED(info.fWidth, info.fHeight)
+    : INHERITED(info.width(), info.height())
 {
-    fBitmap.setConfig(info, rowBytes);
+    fBitmap.setInfo(info, rowBytes);
     fBitmap.setPixelRef(pr);
+    fBitmap.lockPixels();
 }
 
 SkImage_Raster::~SkImage_Raster() {}
 
-void SkImage_Raster::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) {
+SkShader* SkImage_Raster::onNewShader(SkShader::TileMode tileX, SkShader::TileMode tileY,
+                                      const SkMatrix* localMatrix) const {
+    return SkShader::CreateBitmapShader(fBitmap, tileX, tileY, localMatrix);
+}
+
+void SkImage_Raster::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) const {
     canvas->drawBitmap(fBitmap, x, y, paint);
 }
 
-void SkImage_Raster::onDrawRectToRect(SkCanvas* canvas, const SkRect* src, const SkRect& dst, const SkPaint* paint) {
+void SkImage_Raster::onDrawRect(SkCanvas* canvas, const SkRect* src, const SkRect& dst,
+                                      const SkPaint* paint) const {
     canvas->drawBitmapRectToRect(fBitmap, src, dst, paint);
 }
 
+bool SkImage_Raster::onReadPixels(SkBitmap* dst, const SkIRect& subset) const {
+    if (dst->pixelRef()) {
+        return this->INHERITED::onReadPixels(dst, subset);
+    } else {
+        SkBitmap src;
+        if (!fBitmap.extractSubset(&src, subset)) {
+            return false;
+        }
+        return src.copyTo(dst, src.colorType());
+    }
+}
+
+const void* SkImage_Raster::onPeekPixels(SkImageInfo* infoPtr, size_t* rowBytesPtr) const {
+    const SkImageInfo info = fBitmap.info();
+    if ((kUnknown_SkColorType == info.colorType()) || !fBitmap.getPixels()) {
+        return NULL;
+    }
+    *infoPtr = info;
+    *rowBytesPtr = fBitmap.rowBytes();
+    return fBitmap.getPixels();
+}
+
 bool SkImage_Raster::getROPixels(SkBitmap* dst) const {
     *dst = fBitmap;
     return true;
@@ -119,7 +169,7 @@ SkImage* SkImage::NewRasterCopy(const SkImageInfo& info, const void* pixels, siz
     if (!SkImage_Raster::ValidArgs(info, rowBytes)) {
         return NULL;
     }
-    if (0 == info.fWidth && 0 == info.fHeight) {
+    if (0 == info.width() && 0 == info.height()) {
         return SkImage_Raster::NewEmpty();
     }
     // check this after empty-check
@@ -128,38 +178,49 @@ SkImage* SkImage::NewRasterCopy(const SkImageInfo& info, const void* pixels, siz
     }
 
     // Here we actually make a copy of the caller's pixel data
-    SkAutoDataUnref data(SkData::NewWithCopy(pixels, info.fHeight * rowBytes));
+    SkAutoDataUnref data(SkData::NewWithCopy(pixels, info.height() * rowBytes));
     return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes));
 }
 
 
-SkImage* SkImage::NewRasterData(const SkImageInfo& info, SkData* pixelData, size_t rowBytes) {
+SkImage* SkImage::NewRasterData(const SkImageInfo& info, SkData* data, size_t rowBytes) {
     if (!SkImage_Raster::ValidArgs(info, rowBytes)) {
         return NULL;
     }
-    if (0 == info.fWidth && 0 == info.fHeight) {
+    if (0 == info.width() && 0 == info.height()) {
         return SkImage_Raster::NewEmpty();
     }
     // check this after empty-check
-    if (NULL == pixelData) {
+    if (NULL == data) {
         return NULL;
     }
 
     // did they give us enough data?
-    size_t size = info.fHeight * rowBytes;
-    if (pixelData->size() < size) {
+    size_t size = info.height() * rowBytes;
+    if (data->size() < size) {
         return NULL;
     }
 
-    SkAutoDataUnref data(pixelData);
     return SkNEW_ARGS(SkImage_Raster, (info, data, rowBytes));
 }
 
+SkImage* SkImage::NewFromGenerator(SkImageGenerator* generator) {
+    SkBitmap bitmap;
+    if (!SkInstallDiscardablePixelRef(generator, &bitmap)) {
+        return NULL;
+    }
+    return SkNEW_ARGS(SkImage_Raster, (bitmap));
+}
+
 SkImage* SkNewImageFromPixelRef(const SkImageInfo& info, SkPixelRef* pr,
                                 size_t rowBytes) {
     return SkNEW_ARGS(SkImage_Raster, (info, pr, rowBytes));
 }
 
-SkPixelRef* SkBitmapImageGetPixelRef(SkImage* image) {
-    return ((SkImage_Raster*)image)->getPixelRef();
+const SkPixelRef* SkBitmapImageGetPixelRef(const SkImage* image) {
+    return ((const SkImage_Raster*)image)->getPixelRef();
+}
+
+bool SkImage_Raster::isOpaque() const {
+    return fBitmap.isOpaque();
 }