Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Unified Diff: include/core/SkCanvas.h

Issue 2146073003: Creating framework for drawShadowedPicture (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: Made changes to better hide changes from public Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: include/core/SkCanvas.h
diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h
index 35a8d1c7b92193a4d247a4766efe54a2976ce0a6..2c6a807791a955d21c7cb06eeaf84ebc7ee6d84a 100644
--- a/include/core/SkCanvas.h
+++ b/include/core/SkCanvas.h
@@ -17,6 +17,7 @@
#include "SkRegion.h"
#include "SkSurfaceProps.h"
#include "SkXfermode.h"
+#include "SkLights.h"
class GrContext;
class GrDrawContext;
@@ -451,6 +452,7 @@ public:
*/
void resetMatrix();
+#ifdef SK_USE_SHADOWS
/** Add the specified translation to the current draw depth of the canvas.
@param z The distance to translate in Z.
Negative into screen, positive out of screen.
@@ -458,6 +460,16 @@ public:
*/
void translateZ(SkScalar z);
+ /** Set the current set of lights in the canvas.
+ @param lights The lights that we want the canvas to have.
+ */
+ void setLights(sk_sp<SkLights> lights);
+
+ /** Returns the current set of lights the canvas uses
+ */
+ sk_sp<SkLights> getLights() const;
+#endif
+
/**
* Modify the current clip with the specified rectangle.
* @param rect The rect to combine with the current clip
@@ -1049,6 +1061,34 @@ public:
this->drawPicture(picture.get(), matrix, paint);
}
+#ifdef SK_USE_SHADOWS
+ /**
+ * Draw the picture into this canvas.
+ *
+ * We will use the canvas's lights along with the picture information (draw depths of
+ * objects, etc) to first create a set of shadowmaps for the light-picture pairs, and
+ * then use that set of shadowmaps to render the scene with shadows.
+ *
+ * If matrix is non-null, apply that matrix to the CTM when drawing this picture. This is
+ * logically equivalent to
+ * save/concat/drawPicture/restore
+ *
+ * If paint is non-null, draw the picture into a temporary buffer, and then apply the paint's
+ * alpha/colorfilter/imagefilter/xfermode to that buffer as it is drawn to the canvas.
+ * This is logically equivalent to
+ * saveLayer(paint)/drawPicture/restore
+ *
+ */
+ void drawShadowedPicture(const SkPicture*,
+ const SkMatrix* matrix,
+ const SkPaint* paint);
+ void drawShadowedPicture(const sk_sp<SkPicture>& picture,
+ const SkMatrix* matrix,
+ const SkPaint* paint) {
+ this->drawShadowedPicture(picture.get(), matrix, paint);
+ }
+#endif
+
enum VertexMode {
kTriangles_VertexMode,
kTriangleStrip_VertexMode,
@@ -1267,10 +1307,14 @@ public:
void temporary_internal_describeTopLayer(SkMatrix* matrix, SkIRect* clip_bounds);
protected:
+#ifdef SK_USE_SHADOWS
/** Returns the current (cumulative) draw depth of the canvas.
*/
SkScalar getZ() const;
+ sk_sp<SkLights> fLights;
+#endif
+
/** After calling saveLayer(), there can be any number of devices that make
up the top-most drawing area. LayerIter can be used to iterate through
those devices. Note that the iterator is only valid until the next API
@@ -1336,7 +1380,10 @@ protected:
virtual void didRestore() {}
virtual void didConcat(const SkMatrix&) {}
virtual void didSetMatrix(const SkMatrix&) {}
+
+#ifdef SK_USE_SHADOWS
virtual void didTranslateZ(SkScalar) {}
+#endif
virtual void onDrawAnnotation(const SkRect&, const char key[], SkData* value);
virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&);
@@ -1403,6 +1450,12 @@ protected:
virtual void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*);
+#ifdef SK_USE_SHADOWS
+ virtual void onDrawShadowedPicture(const SkPicture*,
+ const SkMatrix*,
+ const SkPaint*);
+#endif
+
// Returns the canvas to be used by DrawIter. Default implementation
// returns this. Subclasses that encapsulate an indirect canvas may
// need to overload this method. The impl must keep track of this, as it
« no previous file with comments | « gyp/core.gypi ('k') | include/core/SkLights.h » ('j') | src/core/SkPictureRecord.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698