Making a sample for shadow maps for more intensive development

Merge branch 'shadow-gm' into shadow-sample

Added variable size shadow maps. Also fixed some bugs

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2198933002

Review-Url: https://codereview.chromium.org/2198933002
diff --git a/gm/shadowmaps.cpp b/gm/shadowmaps.cpp
index 4a0f88e..1ae95fb 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 @@
 
 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 @@
             // 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);