Index: gm/shadowmaps.cpp |
diff --git a/gm/shadowmaps.cpp b/gm/shadowmaps.cpp |
index 4a0f88ec91be1debe1ed7e016209c5c780089aa1..1ae95fb68f5cee6e96e6ed2749faa173a4692de8 100644 |
--- a/gm/shadowmaps.cpp |
+++ b/gm/shadowmaps.cpp |
@@ -7,9 +7,9 @@ |
#include "gm.h" |
-#include "SkPaintFilterCanvas.h" |
#include "SkPathEffect.h" |
#include "SkPictureRecorder.h" |
+#include "SkShadowPaintFilterCanvas.h" |
#include "SkShadowShader.h" |
#include "SkSurface.h" |
@@ -72,210 +72,6 @@ static sk_sp<SkPicture> make_test_picture(int width, int height) { |
namespace skiagm { |
-/* We override the onFilter method to draw depths into the canvas |
- * depending on the current draw depth of the canvas, throwing out |
- * the actual draw color. |
- */ |
-class SkShadowPaintFilterCanvas : public SkPaintFilterCanvas { |
-public: |
- |
- SkShadowPaintFilterCanvas(SkCanvas* canvas) : INHERITED(canvas) { } |
- |
- // TODO use a shader instead |
- bool onFilter(SkTCopyOnFirstWrite<SkPaint>* paint, Type type) const override { |
- if (*paint) { |
- int z = this->getZ(); |
- SkASSERT(z <= 0xFF && z >= 0x00); |
- |
- SkPaint newPaint; |
- newPaint.setPathEffect(sk_ref_sp<SkPathEffect>((*paint)->getPathEffect())); |
- |
- SkColor color = 0xFF000000; // init color to opaque black |
- color |= z; // Put the index into the blue component |
- newPaint.setColor(color); |
- |
- *paint->writable() = newPaint; |
- } |
- |
- return true; |
- } |
- |
- void onDrawPicture(const SkPicture* picture, const SkMatrix* matrix, const SkPaint* paint) { |
- SkTCopyOnFirstWrite<SkPaint> filteredPaint(paint); |
- if (this->onFilter(&filteredPaint, kPicture_Type)) { |
- // we directly call SkCanvas's onDrawPicture because calling the one |
- // that INHERITED has (SkPaintFilterCanvas) leads to wrong behavior |
- this->SkCanvas::onDrawPicture(picture, matrix, filteredPaint); |
- } |
- } |
- |
- void updateMatrix() { |
- this->save(); |
- |
- // When we use the SkShadowPaintFilterCanvas, we can only render |
- // one depth map at a time. Thus, we leave it up to the user to |
- // set SkLights to only contain (or contain at the first position) |
- // the light they intend to use for the current depth rendering. |
- |
- if (fLights->numLights() > 0 && |
- this->fLights->light(0).type() == SkLights::Light::kDirectional_LightType) { |
- SkVector3 lightDir = this->fLights->light(0).dir(); |
- SkScalar x = lightDir.fX * this->getZ(); |
- SkScalar y = lightDir.fY * this->getZ(); |
- |
- this->translate(x, y); |
- } |
- |
- } |
- |
- void onDrawPaint(const SkPaint& paint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawPaint(paint); |
- this->restore(); |
- } |
- |
- void onDrawPoints(PointMode mode, size_t count, const SkPoint pts[], |
- const SkPaint& paint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawPoints(mode, count, pts, paint); |
- this->restore(); |
- } |
- |
- void onDrawRect(const SkRect& rect, const SkPaint& paint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawRect(rect, paint); |
- this->restore(); |
- } |
- |
- void onDrawRRect(const SkRRect& rrect, const SkPaint& paint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawRRect(rrect, paint); |
- this->restore(); |
- } |
- |
- void onDrawDRRect(const SkRRect& outer, const SkRRect& inner, |
- const SkPaint& paint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawDRRect(outer, inner, paint); |
- this->restore(); |
- } |
- |
- void onDrawOval(const SkRect& rect, const SkPaint& paint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawOval(rect, paint); |
- this->restore(); |
- } |
- |
- void onDrawPath(const SkPath& path, const SkPaint& paint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawPath(path, paint); |
- this->restore(); |
- } |
- |
- void onDrawBitmap(const SkBitmap& bm, SkScalar left, SkScalar top, |
- const SkPaint* paint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawBitmap(bm, left, top, paint); |
- this->restore(); |
- } |
- |
- void onDrawBitmapRect(const SkBitmap& bm, const SkRect* src, const SkRect& dst, |
- const SkPaint* paint, SrcRectConstraint constraint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawBitmapRect(bm, src, dst, paint, constraint); |
- this->restore(); |
- } |
- |
- void onDrawBitmapNine(const SkBitmap& bm, const SkIRect& center, |
- const SkRect& dst, const SkPaint* paint) { |
- this->updateMatrix(); |
- this->INHERITED::onDrawBitmapNine(bm, center, dst, paint); |
- this->restore(); |
- } |
- |
- void onDrawImage(const SkImage* image, SkScalar left, SkScalar top, |
- const SkPaint* paint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawImage(image, left, top, paint); |
- this->restore(); |
- } |
- |
- void onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst, |
- const SkPaint* paint, SrcRectConstraint constraint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawImageRect(image, src, dst, paint, constraint); |
- this->restore(); |
- } |
- |
- void onDrawImageNine(const SkImage* image, const SkIRect& center, |
- const SkRect& dst, const SkPaint* paint) { |
- this->updateMatrix(); |
- this->INHERITED::onDrawImageNine(image, center, dst, paint); |
- this->restore(); |
- } |
- |
- 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 { |
- this->updateMatrix(); |
- this->INHERITED::onDrawVertices(vmode, vertexCount, vertices, texs, colors, |
- xmode, indices, indexCount, paint); |
- this->restore(); |
- } |
- |
- void onDrawPatch(const SkPoint cubics[], const SkColor colors[], const SkPoint texCoords[], |
- SkXfermode* xmode, const SkPaint& paint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawPatch(cubics, colors, texCoords, xmode, paint); |
- this->restore(); |
- } |
- |
- void onDrawText(const void* text, size_t byteLength, |
- SkScalar x, SkScalar y, const SkPaint& paint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawText(text, byteLength, x, y, paint); |
- this->restore(); |
- } |
- |
- void onDrawPosText(const void* text, size_t byteLength, |
- const SkPoint pos[], const SkPaint& paint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawPosText(text, byteLength, pos, paint); |
- this->restore(); |
- } |
- |
- void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], |
- SkScalar constY, const SkPaint& paint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawPosTextH(text, byteLength, xpos, constY, paint); |
- this->restore(); |
- } |
- |
- void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, |
- const SkMatrix* matrix, const SkPaint& paint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawTextOnPath(text, byteLength, path, matrix, paint); |
- this->restore(); |
- } |
- |
- void onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[], |
- const SkRect* cull, const SkPaint& paint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawTextRSXform(text, byteLength, xform, cull, paint); |
- this->restore(); |
- } |
- |
- void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, |
- const SkPaint& paint) override { |
- this->updateMatrix(); |
- this->INHERITED::onDrawTextBlob(blob, x, y, paint); |
- this->restore(); |
- } |
- |
-private: |
- typedef SkPaintFilterCanvas INHERITED; |
-}; |
- |
class ShadowMapsGM : public GM { |
public: |
ShadowMapsGM() { |
@@ -322,7 +118,11 @@ protected: |
// TODO: compute the correct size of the depth map from the light properties |
// TODO: maybe add a kDepth_8_SkColorType |
- SkImageInfo info = SkImageInfo::Make(kWidth, kHeight, |
+ // TODO: find actual max depth of picture |
+ SkISize shMapSize = SkShadowPaintFilterCanvas:: |
+ ComputeDepthMapSize(fLights->light(i), 255, kWidth, kHeight); |
+ |
+ SkImageInfo info = SkImageInfo::Make(shMapSize.fWidth, shMapSize.fHeight, |
kBGRA_8888_SkColorType, |
kOpaque_SkAlphaType); |