michael@0: /* michael@0: * Copyright 2013 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: #include "SkLuaCanvas.h" michael@0: #include "SkLua.h" michael@0: michael@0: extern "C" { michael@0: #include "lua.h" michael@0: #include "lauxlib.h" michael@0: } michael@0: michael@0: class AutoCallLua : public SkLua { michael@0: public: michael@0: AutoCallLua(lua_State* L, const char func[], const char verb[]) : INHERITED(L) { michael@0: lua_getglobal(L, func); michael@0: if (!lua_isfunction(L, -1)) { michael@0: int t = lua_type(L, -1); michael@0: SkDebugf("--- expected function %d\n", t); michael@0: } michael@0: michael@0: lua_newtable(L); michael@0: this->pushString(verb, "verb"); michael@0: } michael@0: michael@0: ~AutoCallLua() { michael@0: lua_State* L = this->get(); michael@0: if (lua_pcall(L, 1, 0, 0) != LUA_OK) { michael@0: SkDebugf("lua err: %s\n", lua_tostring(L, -1)); michael@0: } michael@0: lua_settop(L, -1); michael@0: } michael@0: michael@0: void pushEncodedText(SkPaint::TextEncoding, const void*, size_t); michael@0: michael@0: private: michael@0: typedef SkLua INHERITED; michael@0: }; michael@0: michael@0: #define AUTO_LUA(verb) AutoCallLua lua(fL, fFunc.c_str(), verb) michael@0: michael@0: michael@0: /////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: void AutoCallLua::pushEncodedText(SkPaint::TextEncoding enc, const void* text, michael@0: size_t length) { michael@0: switch (enc) { michael@0: case SkPaint::kUTF8_TextEncoding: michael@0: this->pushString((const char*)text, length, "text"); michael@0: break; michael@0: case SkPaint::kUTF16_TextEncoding: { michael@0: SkString str; michael@0: str.setUTF16((const uint16_t*)text, length); michael@0: this->pushString(str, "text"); michael@0: } break; michael@0: case SkPaint::kGlyphID_TextEncoding: michael@0: this->pushArrayU16((const uint16_t*)text, SkToInt(length >> 1), michael@0: "glyphs"); michael@0: break; michael@0: case SkPaint::kUTF32_TextEncoding: michael@0: break; michael@0: } michael@0: } michael@0: michael@0: /////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: void SkLuaCanvas::pushThis() { michael@0: SkLua(fL).pushCanvas(this); michael@0: } michael@0: michael@0: /////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: SkLuaCanvas::SkLuaCanvas(int width, int height, lua_State* L, const char func[]) michael@0: : INHERITED(width, height) michael@0: , fL(L) michael@0: , fFunc(func) { michael@0: } michael@0: michael@0: SkLuaCanvas::~SkLuaCanvas() {} michael@0: michael@0: void SkLuaCanvas::willSave(SaveFlags flags) { michael@0: AUTO_LUA("save"); michael@0: this->INHERITED::willSave(flags); michael@0: } michael@0: michael@0: SkCanvas::SaveLayerStrategy SkLuaCanvas::willSaveLayer(const SkRect* bounds, const SkPaint* paint, michael@0: SaveFlags flags) { michael@0: AUTO_LUA("saveLayer"); michael@0: if (bounds) { michael@0: lua.pushRect(*bounds, "bounds"); michael@0: } michael@0: if (paint) { michael@0: lua.pushPaint(*paint, "paint"); michael@0: } michael@0: michael@0: this->INHERITED::willSaveLayer(bounds, paint, flags); michael@0: // No need for a layer. michael@0: return kNoLayer_SaveLayerStrategy; michael@0: } michael@0: michael@0: void SkLuaCanvas::willRestore() { michael@0: AUTO_LUA("restore"); michael@0: this->INHERITED::willRestore(); michael@0: } michael@0: michael@0: void SkLuaCanvas::didTranslate(SkScalar dx, SkScalar dy) { michael@0: AUTO_LUA("translate"); michael@0: lua.pushScalar(dx, "dx"); michael@0: lua.pushScalar(dy, "dy"); michael@0: this->INHERITED::didTranslate(dx, dy); michael@0: } michael@0: michael@0: void SkLuaCanvas::didScale(SkScalar sx, SkScalar sy) { michael@0: AUTO_LUA("scale"); michael@0: lua.pushScalar(sx, "sx"); michael@0: lua.pushScalar(sy, "sy"); michael@0: this->INHERITED::didScale(sx, sy); michael@0: } michael@0: michael@0: void SkLuaCanvas::didRotate(SkScalar degrees) { michael@0: AUTO_LUA("rotate"); michael@0: lua.pushScalar(degrees, "degrees"); michael@0: this->INHERITED::didRotate(degrees); michael@0: } michael@0: michael@0: void SkLuaCanvas::didSkew(SkScalar kx, SkScalar ky) { michael@0: AUTO_LUA("skew"); michael@0: lua.pushScalar(kx, "kx"); michael@0: lua.pushScalar(ky, "ky"); michael@0: this->INHERITED::didSkew(kx, ky); michael@0: } michael@0: michael@0: void SkLuaCanvas::didConcat(const SkMatrix& matrix) { michael@0: AUTO_LUA("concat"); michael@0: this->INHERITED::didConcat(matrix); michael@0: } michael@0: michael@0: void SkLuaCanvas::didSetMatrix(const SkMatrix& matrix) { michael@0: this->INHERITED::didSetMatrix(matrix); michael@0: } michael@0: michael@0: void SkLuaCanvas::onClipRect(const SkRect& r, SkRegion::Op op, ClipEdgeStyle edgeStyle) { michael@0: AUTO_LUA("clipRect"); michael@0: lua.pushRect(r, "rect"); michael@0: lua.pushBool(kSoft_ClipEdgeStyle == edgeStyle, "aa"); michael@0: this->INHERITED::onClipRect(r, op, edgeStyle); michael@0: } michael@0: michael@0: void SkLuaCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) { michael@0: AUTO_LUA("clipRRect"); michael@0: lua.pushRRect(rrect, "rrect"); michael@0: lua.pushBool(kSoft_ClipEdgeStyle == edgeStyle, "aa"); michael@0: this->INHERITED::onClipRRect(rrect, op, edgeStyle); michael@0: } michael@0: michael@0: void SkLuaCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) { michael@0: AUTO_LUA("clipPath"); michael@0: lua.pushPath(path, "path"); michael@0: lua.pushBool(kSoft_ClipEdgeStyle == edgeStyle, "aa"); michael@0: this->INHERITED::onClipPath(path, op, edgeStyle); michael@0: } michael@0: michael@0: void SkLuaCanvas::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) { michael@0: AUTO_LUA("clipRegion"); michael@0: this->INHERITED::onClipRegion(deviceRgn, op); michael@0: } michael@0: michael@0: void SkLuaCanvas::drawPaint(const SkPaint& paint) { michael@0: AUTO_LUA("drawPaint"); michael@0: lua.pushPaint(paint, "paint"); michael@0: } michael@0: michael@0: void SkLuaCanvas::drawPoints(PointMode mode, size_t count, michael@0: const SkPoint pts[], const SkPaint& paint) { michael@0: AUTO_LUA("drawPoints"); michael@0: lua.pushPaint(paint, "paint"); michael@0: } michael@0: michael@0: void SkLuaCanvas::drawOval(const SkRect& rect, const SkPaint& paint) { michael@0: AUTO_LUA("drawOval"); michael@0: lua.pushRect(rect, "rect"); michael@0: lua.pushPaint(paint, "paint"); michael@0: } michael@0: michael@0: void SkLuaCanvas::drawRect(const SkRect& rect, const SkPaint& paint) { michael@0: AUTO_LUA("drawRect"); michael@0: lua.pushRect(rect, "rect"); michael@0: lua.pushPaint(paint, "paint"); michael@0: } michael@0: michael@0: void SkLuaCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) { michael@0: AUTO_LUA("drawRRect"); michael@0: lua.pushRRect(rrect, "rrect"); michael@0: lua.pushPaint(paint, "paint"); michael@0: } michael@0: michael@0: void SkLuaCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, michael@0: const SkPaint& paint) { michael@0: AUTO_LUA("drawDRRect"); michael@0: lua.pushRRect(outer, "outer"); michael@0: lua.pushRRect(inner, "inner"); michael@0: lua.pushPaint(paint, "paint"); michael@0: } michael@0: michael@0: void SkLuaCanvas::drawPath(const SkPath& path, const SkPaint& paint) { michael@0: AUTO_LUA("drawPath"); michael@0: lua.pushPath(path, "path"); michael@0: lua.pushPaint(paint, "paint"); michael@0: } michael@0: michael@0: void SkLuaCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, michael@0: const SkPaint* paint) { michael@0: AUTO_LUA("drawBitmap"); michael@0: if (paint) { michael@0: lua.pushPaint(*paint, "paint"); michael@0: } michael@0: } michael@0: michael@0: void SkLuaCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src, michael@0: const SkRect& dst, const SkPaint* paint, michael@0: DrawBitmapRectFlags flags) { michael@0: AUTO_LUA("drawBitmapRectToRect"); michael@0: if (paint) { michael@0: lua.pushPaint(*paint, "paint"); michael@0: } michael@0: } michael@0: michael@0: void SkLuaCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m, michael@0: const SkPaint* paint) { michael@0: AUTO_LUA("drawBitmapMatrix"); michael@0: if (paint) { michael@0: lua.pushPaint(*paint, "paint"); michael@0: } michael@0: } michael@0: michael@0: void SkLuaCanvas::drawSprite(const SkBitmap& bitmap, int x, int y, michael@0: const SkPaint* paint) { michael@0: AUTO_LUA("drawSprite"); michael@0: if (paint) { michael@0: lua.pushPaint(*paint, "paint"); michael@0: } michael@0: } michael@0: michael@0: void SkLuaCanvas::drawText(const void* text, size_t byteLength, SkScalar x, michael@0: SkScalar y, const SkPaint& paint) { michael@0: AUTO_LUA("drawText"); michael@0: lua.pushEncodedText(paint.getTextEncoding(), text, byteLength); michael@0: lua.pushPaint(paint, "paint"); michael@0: } michael@0: michael@0: void SkLuaCanvas::drawPosText(const void* text, size_t byteLength, michael@0: const SkPoint pos[], const SkPaint& paint) { michael@0: AUTO_LUA("drawPosText"); michael@0: lua.pushEncodedText(paint.getTextEncoding(), text, byteLength); michael@0: lua.pushPaint(paint, "paint"); michael@0: } michael@0: michael@0: void SkLuaCanvas::drawPosTextH(const void* text, size_t byteLength, michael@0: const SkScalar xpos[], SkScalar constY, michael@0: const SkPaint& paint) { michael@0: AUTO_LUA("drawPosTextH"); michael@0: lua.pushEncodedText(paint.getTextEncoding(), text, byteLength); michael@0: lua.pushPaint(paint, "paint"); michael@0: } michael@0: michael@0: void SkLuaCanvas::drawTextOnPath(const void* text, size_t byteLength, michael@0: const SkPath& path, const SkMatrix* matrix, michael@0: const SkPaint& paint) { michael@0: AUTO_LUA("drawTextOnPath"); michael@0: lua.pushPath(path, "path"); michael@0: lua.pushEncodedText(paint.getTextEncoding(), text, byteLength); michael@0: lua.pushPaint(paint, "paint"); michael@0: } michael@0: michael@0: void SkLuaCanvas::drawPicture(SkPicture& picture) { michael@0: AUTO_LUA("drawPicture"); michael@0: // call through so we can see the nested picture ops michael@0: this->INHERITED::drawPicture(picture); michael@0: } michael@0: michael@0: void SkLuaCanvas::drawVertices(VertexMode vmode, int vertexCount, michael@0: const SkPoint vertices[], const SkPoint texs[], michael@0: const SkColor colors[], SkXfermode* xmode, michael@0: const uint16_t indices[], int indexCount, michael@0: const SkPaint& paint) { michael@0: AUTO_LUA("drawVertices"); michael@0: lua.pushPaint(paint, "paint"); michael@0: } michael@0: michael@0: void SkLuaCanvas::drawData(const void* data, size_t length) { michael@0: AUTO_LUA("drawData"); michael@0: }