Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / effects / SkRectShaderImageFilter.cpp
index f55df2c..09417c8 100644 (file)
@@ -9,7 +9,8 @@
 #include "SkBitmap.h"
 #include "SkCanvas.h"
 #include "SkDevice.h"
-#include "SkFlattenableBuffers.h"
+#include "SkReadBuffer.h"
+#include "SkWriteBuffer.h"
 #include "SkShader.h"
 
 SkRectShaderImageFilter* SkRectShaderImageFilter::Create(SkShader* s, const SkRect& rect) {
@@ -19,44 +20,49 @@ SkRectShaderImageFilter* SkRectShaderImageFilter::Create(SkShader* s, const SkRe
         flags = 0x0;
     }
     CropRect cropRect(rect, flags);
-    return SkNEW_ARGS(SkRectShaderImageFilter, (s, &cropRect));
+    return s ? SkNEW_ARGS(SkRectShaderImageFilter, (s, &cropRect)) : NULL;
 }
 
-SkRectShaderImageFilter* SkRectShaderImageFilter::Create(SkShader* s, const CropRect* cropRect) {
+SkRectShaderImageFilter* SkRectShaderImageFilter::Create(SkShader* s, const CropRect* cropRect, uint32_t uniqueID) {
     SkASSERT(s);
-    return SkNEW_ARGS(SkRectShaderImageFilter, (s, cropRect));
+    return s ? SkNEW_ARGS(SkRectShaderImageFilter, (s, cropRect, uniqueID)) : NULL;
 }
 
-SkRectShaderImageFilter::SkRectShaderImageFilter(SkShader* s, const CropRect* cropRect)
-  : INHERITED(NULL, cropRect)
-  , fShader(s) {
-    SkASSERT(s);
-    s->ref();
+SkRectShaderImageFilter::SkRectShaderImageFilter(SkShader* s, const CropRect* cropRect,
+                                                 uint32_t uniqueID)
+  : INHERITED(0, NULL, cropRect, uniqueID)
+  , fShader(SkRef(s)) {
 }
 
-SkRectShaderImageFilter::SkRectShaderImageFilter(SkFlattenableReadBuffer& buffer)
-  : INHERITED(1, buffer) {
+#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
+SkRectShaderImageFilter::SkRectShaderImageFilter(SkReadBuffer& buffer)
+  : INHERITED(0, buffer) {
     fShader = buffer.readShader();
 }
+#endif
 
-void SkRectShaderImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const {
-    this->INHERITED::flatten(buffer);
+SkFlattenable* SkRectShaderImageFilter::CreateProc(SkReadBuffer& buffer) {
+    SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 0);
+    SkAutoTUnref<SkShader> shader(buffer.readShader());
+    return Create(shader.get(), &common.cropRect(), common.uniqueID());
+}
 
+void SkRectShaderImageFilter::flatten(SkWriteBuffer& buffer) const {
+    this->INHERITED::flatten(buffer);
     buffer.writeFlattenable(fShader);
 }
 
 SkRectShaderImageFilter::~SkRectShaderImageFilter() {
-    SkSafeUnref(fShader);
+    fShader->unref();
 }
 
 bool SkRectShaderImageFilter::onFilterImage(Proxy* proxy,
                                             const SkBitmap& source,
-                                            const SkMatrix& ctm,
+                                            const Context& ctx,
                                             SkBitmap* result,
-                                            SkIPoint* offset) {
+                                            SkIPoint* offset) const {
     SkIRect bounds;
-    source.getBounds(&bounds);
-    if (!this->applyCropRect(&bounds, ctm)) {
+    if (!this->applyCropRect(ctx, source, SkIPoint::Make(0, 0), &bounds)) {
         return false;
     }
 
@@ -66,13 +72,15 @@ bool SkRectShaderImageFilter::onFilterImage(Proxy* proxy,
         return false;
     }
     SkCanvas canvas(device.get());
+
     SkPaint paint;
-    paint.setShader(fShader);
-    SkMatrix matrix;
-    matrix.setTranslate(-SkIntToScalar(bounds.fLeft), -SkIntToScalar(bounds.fTop));
-    fShader->setLocalMatrix(matrix);
+    SkMatrix matrix(ctx.ctm());
+    matrix.postTranslate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.top()));
+    SkSafeUnref(paint.setShader(SkShader::CreateLocalMatrixShader(fShader, matrix)));
+
     SkRect rect = SkRect::MakeWH(SkIntToScalar(bounds.width()), SkIntToScalar(bounds.height()));
     canvas.drawRect(rect, paint);
+
     *result = device.get()->accessBitmap(false);
     offset->fX = bounds.fLeft;
     offset->fY = bounds.fTop;