Index: src/core/SkRemote.cpp |
diff --git a/src/core/SkRemote.cpp b/src/core/SkRemote.cpp |
index bc89e6ff2a6f983c2526fc6c4ef063326e3d2052..dd0b25d62c472eadddd117100a0f7592f98ee157 100644 |
--- a/src/core/SkRemote.cpp |
+++ b/src/core/SkRemote.cpp |
@@ -9,8 +9,10 @@ |
#include "SkCanvas.h" |
#include "SkColorFilter.h" |
#include "SkDrawLooper.h" |
+#include "SkImage.h" |
#include "SkImageFilter.h" |
#include "SkMaskFilter.h" |
+#include "SkNinePatchIter.h" |
#include "SkPath.h" |
#include "SkPathEffect.h" |
#include "SkRasterizer.h" |
@@ -160,6 +162,12 @@ namespace SkRemote { |
void willSave() override { fEncoder-> save(); } |
void didRestore() override { fEncoder->restore(); } |
+ SaveLayerStrategy willSaveLayer(const SkRect* bounds, |
+ const SkPaint* paint, |
+ SaveFlags flags) override { |
+ // TODO |
+ return kNoLayer_SaveLayerStrategy; |
+ } |
void didConcat(const SkMatrix&) override { this->didSetMatrix(this->getTotalMatrix()); } |
void didSetMatrix(const SkMatrix& matrix) override { |
@@ -210,6 +218,138 @@ namespace SkRemote { |
this->onDrawPath(path, paint); |
} |
+ void onDrawPoints(PointMode mode, |
+ size_t count, |
+ const SkPoint pts[], |
+ const SkPaint& paint) override { |
+ // TODO |
+ } |
+ |
+ void onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix) override { |
+ // TODO |
+ this->INHERITED::onDrawDrawable(drawable, matrix); |
+ } |
+ |
+ void onDrawPicture(const SkPicture* pic, |
+ const SkMatrix* matrix, |
+ const SkPaint* paint) override { |
+ // TODO |
+ this->INHERITED::onDrawPicture(pic, matrix, paint); |
+ } |
+ |
+ void onDrawVertices(VertexMode vmode, |
+ int vertexCount, |
+ const SkPoint vertices[], |
+ const SkPoint texs[], |
+ const SkColor colors[], |
+ SkXfermode* xmode, |
+ const uint16_t indices[], |
+ int indexCount, |
+ const SkPaint& paint) override { |
+ // TODO |
+ } |
+ |
+ void onDrawPatch(const SkPoint cubics[12], |
+ const SkColor colors[4], |
+ const SkPoint texCoords[4], |
+ SkXfermode* xmode, |
+ const SkPaint& paint) override { |
+ // TODO |
+ } |
+ |
+ void onDrawAtlas(const SkImage* atlas, |
+ const SkRSXform xform[], |
+ const SkRect tex[], |
+ const SkColor colors[], |
+ int count, |
+ SkXfermode::Mode mode, |
+ const SkRect* cull, |
+ const SkPaint* paint) override { |
+ // TODO |
+ } |
+ |
+ void onDrawBitmap(const SkBitmap& bitmap, |
+ SkScalar left, |
+ SkScalar top, |
+ const SkPaint* paint) override { |
+ auto src = SkRect::MakeWH(bitmap.width(), bitmap.height()), |
+ dst = src.makeOffset(left, top); |
+ this->onDrawBitmapRect(bitmap, &src, dst, paint, kStrict_SrcRectConstraint); |
+ } |
+ |
+ void onDrawBitmapRect(const SkBitmap& bitmap, |
+ const SkRect* src, |
+ const SkRect& dst, |
+ const SkPaint* paint, |
+ SrcRectConstraint constraint) override { |
+ SkAutoTUnref<SkImage> image(SkImage::NewFromBitmap(bitmap)); |
+ this->onDrawImageRect(image, src, dst, paint, constraint); |
+ } |
+ |
+ void onDrawImage(const SkImage* image, |
+ SkScalar left, |
+ SkScalar top, |
+ const SkPaint* paint) override { |
+ if (!image) { |
+ return; |
+ } |
+ auto src = SkRect::MakeWH(image->width(), image->height()), |
+ dst = src.makeOffset(left, top); |
+ this->onDrawImageRect(image, &src, dst, paint, kStrict_SrcRectConstraint); |
+ } |
+ |
+ void onDrawImageRect(const SkImage* image, |
+ const SkRect* src, |
+ const SkRect& dst, |
+ const SkPaint* paint, |
+ SrcRectConstraint constraint) override { |
+ // TODO: this is all a (likely buggy) hack to get images drawing quickly. |
+ if (!image) { |
+ return; |
+ } |
+ |
+ auto bounds = SkRect::MakeWH(image->width(), image->height()); |
+ if (!src) { |
+ src = &bounds; |
+ } |
+ auto matrix = SkMatrix::MakeRectToRect(*src, dst, SkMatrix::kFill_ScaleToFit); |
+ |
+ SkAutoTUnref<SkImage> subset; |
+ if (src) { |
+ if (!bounds.intersect(*src)) { |
+ return; |
+ } |
+ subset.reset(image->newSubset(bounds.roundOut())); |
+ image = subset; |
+ } |
+ |
+ auto paintWithShader = paint ? *paint : SkPaint(); |
+ SkAutoTUnref<SkShader> shader( |
+ image->newShader(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, &matrix)); |
+ paintWithShader.setShader(shader); |
+ |
+ this->onDrawRect(dst, paintWithShader); |
+ } |
+ |
+ void onDrawBitmapNine(const SkBitmap& bitmap, |
+ const SkIRect& center, |
+ const SkRect& dst, |
+ const SkPaint* paint) override { |
+ SkAutoTUnref<SkImage> image(SkImage::NewFromBitmap(bitmap)); |
+ this->onDrawImageNine(image, center, dst, paint); |
+ } |
+ |
+ void onDrawImageNine(const SkImage* image, |
+ const SkIRect& center, |
+ const SkRect& dst, |
+ const SkPaint* paint) override { |
+ SkNinePatchIter iter(image->width(), image->height(), center, dst); |
+ SkRect s,d; |
+ while (iter.next(&s, &d)) { |
+ this->onDrawImageRect(image, &s, d, paint, kStrict_SrcRectConstraint); |
+ } |
+ } |
+ |
void onDrawText(const void* text, size_t byteLength, |
SkScalar x, SkScalar y, const SkPaint& paint) override { |
// Text-as-paths is a temporary hack. |
@@ -238,23 +378,33 @@ namespace SkRemote { |
this->onDrawPosText(text, byteLength, &pos[0], paint); |
} |
+ // All clip calls need to call their parent method or we'll not get any quick rejects. |
void onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) override { |
+ this->INHERITED::onClipRect(rect, op, edgeStyle); |
SkPath path; |
path.addRect(rect); |
this->onClipPath(path, op, edgeStyle); |
} |
void onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) override { |
+ this->INHERITED::onClipRRect(rrect, op, edgeStyle); |
SkPath path; |
path.addRRect(rrect); |
this->onClipPath(path, op, edgeStyle); |
} |
void onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) override { |
+ this->INHERITED::onClipPath(path, op, edgeStyle); |
fEncoder->clipPath(this->id(path), op, edgeStyle == kSoft_ClipEdgeStyle); |
} |
+ void onClipRegion(const SkRegion& region, SkRegion::Op op) override { |
+ this->INHERITED::onClipRegion(region, op); |
+ // TODO |
+ } |
+ |
Encoder* fEncoder; |
+ typedef SkCanvas INHERITED; |
}; |
SkCanvas* NewCanvas(Encoder* encoder) { return new Canvas(encoder); } |