aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/utils
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-26 20:22:32 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-26 20:22:32 +0000
commit4ebe3821888d550d8a8b89341ec251ba942f0225 (patch)
tree19b88320d8eb8e0616754c4da672c629424ba205 /src/utils
parent16f418080ff6751e15e0193263149412de9c848a (diff)
Revert "Revert of Add getReducedClipStack to lua canvas (https://codereview.chromium.org/180283004/)"
This reverts commit efded03a38d6147caaf2d951638d27fdd47eed64. Fixes builds Review URL: https://codereview.chromium.org/181903002 git-svn-id: http://skia.googlecode.com/svn/trunk@13599 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/SkLua.cpp92
1 files changed, 72 insertions, 20 deletions
diff --git a/src/utils/SkLua.cpp b/src/utils/SkLua.cpp
index ec276db1f6..d1193a7693 100644
--- a/src/utils/SkLua.cpp
+++ b/src/utils/SkLua.cpp
@@ -6,8 +6,12 @@
*/
#include "SkLua.h"
+
+#if SK_SUPPORT_GPU
+#include "GrReducedClip.h"
+#endif
+
#include "SkCanvas.h"
-#include "SkClipStack.h"
#include "SkData.h"
#include "SkDocument.h"
#include "SkImage.h"
@@ -273,29 +277,35 @@ void SkLua::pushClipStack(const SkClipStack& stack, const char* key) {
const SkClipStack::Element* element;
int i = 0;
while (NULL != (element = iter.next())) {
- lua_newtable(fL);
- SkClipStack::Element::Type type = element->getType();
- this->pushString(element_type(type), "type");
- switch (type) {
- case SkClipStack::Element::kEmpty_Type:
- break;
- case SkClipStack::Element::kRect_Type:
- this->pushRect(element->getRect(), "rect");
- break;
- case SkClipStack::Element::kRRect_Type:
- this->pushRRect(element->getRRect(), "rrect");
- break;
- case SkClipStack::Element::kPath_Type:
- this->pushPath(element->getPath(), "path");
- break;
- }
- this->pushString(region_op(element->getOp()), "op");
- this->pushBool(element->isAA(), "aa");
+ this->pushClipStackElement(*element);
lua_rawseti(fL, -2, ++i);
}
CHECK_SETFIELD(key);
}
+void SkLua::pushClipStackElement(const SkClipStack::Element& element, const char* key) {
+ lua_newtable(fL);
+ SkClipStack::Element::Type type = element.getType();
+ this->pushString(element_type(type), "type");
+ switch (type) {
+ case SkClipStack::Element::kEmpty_Type:
+ break;
+ case SkClipStack::Element::kRect_Type:
+ this->pushRect(element.getRect(), "rect");
+ break;
+ case SkClipStack::Element::kRRect_Type:
+ this->pushRRect(element.getRRect(), "rrect");
+ break;
+ case SkClipStack::Element::kPath_Type:
+ this->pushPath(element.getPath(), "path");
+ break;
+ }
+ this->pushString(region_op(element.getOp()), "op");
+ this->pushBool(element.isAA(), "aa");
+ CHECK_SETFIELD(key);
+}
+
+
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
@@ -444,6 +454,45 @@ static int lcanvas_getClipStack(lua_State* L) {
return 1;
}
+int SkLua::lcanvas_getReducedClipStack(lua_State* L) {
+#if SK_SUPPORT_GPU
+ const SkCanvas* canvas = get_ref<SkCanvas>(L, 1);
+ SkISize layerSize = canvas->getTopLayerSize();
+ SkIPoint layerOrigin = canvas->getTopLayerOrigin();
+ SkIRect queryBounds = SkIRect::MakeXYWH(layerOrigin.fX, layerOrigin.fY,
+ layerSize.fWidth, layerSize.fHeight);
+
+ GrReducedClip::ElementList elements;
+ GrReducedClip::InitialState initialState;
+ int32_t genID;
+ SkIRect resultBounds;
+
+ const SkClipStack& stack = *canvas->getClipStack();
+
+ GrReducedClip::ReduceClipStack(stack,
+ queryBounds,
+ &elements,
+ &genID,
+ &initialState,
+ &resultBounds,
+ NULL);
+
+ GrReducedClip::ElementList::Iter iter(elements);
+ int i = 0;
+ lua_newtable(L);
+ while(NULL != iter.get()) {
+ SkLua(L).pushClipStackElement(*iter.get());
+ iter.next();
+ lua_rawseti(L, -2, ++i);
+ }
+ // Currently this only returns the element list to lua, not the initial state or result bounds.
+ // It could return these as additional items on the lua stack.
+ return 1;
+#else
+ return 0;
+#endif
+}
+
static int lcanvas_save(lua_State* L) {
lua_pushinteger(L, get_ref<SkCanvas>(L, 1)->save());
return 1;
@@ -479,7 +528,7 @@ static int lcanvas_gc(lua_State* L) {
return 0;
}
-static const struct luaL_Reg gSkCanvas_Methods[] = {
+const struct luaL_Reg gSkCanvas_Methods[] = {
{ "drawColor", lcanvas_drawColor },
{ "drawRect", lcanvas_drawRect },
{ "drawOval", lcanvas_drawOval },
@@ -490,6 +539,9 @@ static const struct luaL_Reg gSkCanvas_Methods[] = {
{ "getSaveCount", lcanvas_getSaveCount },
{ "getTotalMatrix", lcanvas_getTotalMatrix },
{ "getClipStack", lcanvas_getClipStack },
+#if SK_SUPPORT_GPU
+ { "getReducedClipStack", SkLua::lcanvas_getReducedClipStack },
+#endif
{ "save", lcanvas_save },
{ "restore", lcanvas_restore },
{ "scale", lcanvas_scale },