Home | History | Annotate | Download | only in utils
      1 /*
      2  * Copyright 2013 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "SkLuaCanvas.h"
      9 #include "SkLua.h"
     10 
     11 extern "C" {
     12     #include "lua.h"
     13     #include "lauxlib.h"
     14 }
     15 
     16 class AutoCallLua : public SkLua {
     17 public:
     18     AutoCallLua(lua_State* L, const char func[], const char verb[]) : INHERITED(L) {
     19         lua_getglobal(L, func);
     20         if (!lua_isfunction(L, -1)) {
     21             int t = lua_type(L, -1);
     22             SkDebugf("--- expected function %d\n", t);
     23         }
     24 
     25         lua_newtable(L);
     26         this->pushString(verb, "verb");
     27     }
     28 
     29     ~AutoCallLua() {
     30         lua_State* L = this->get();
     31         if (lua_pcall(L, 1, 0, 0) != LUA_OK) {
     32             SkDebugf("lua err: %s\n", lua_tostring(L, -1));
     33         }
     34         lua_settop(L, -1);
     35     }
     36 
     37     void pushEncodedText(SkPaint::TextEncoding, const void*, size_t);
     38 
     39 private:
     40     typedef SkLua INHERITED;
     41 };
     42 
     43 #define AUTO_LUA(verb)  AutoCallLua lua(fL, fFunc.c_str(), verb)
     44 
     45 
     46 ///////////////////////////////////////////////////////////////////////////////
     47 
     48 void AutoCallLua::pushEncodedText(SkPaint::TextEncoding enc, const void* text,
     49                                   size_t length) {
     50     switch (enc) {
     51         case SkPaint::kUTF8_TextEncoding:
     52             this->pushString((const char*)text, length, "text");
     53             break;
     54         case SkPaint::kUTF16_TextEncoding: {
     55             SkString str;
     56             str.setUTF16((const uint16_t*)text, length);
     57             this->pushString(str, "text");
     58         } break;
     59         case SkPaint::kGlyphID_TextEncoding:
     60             this->pushArrayU16((const uint16_t*)text, SkToInt(length >> 1),
     61                                "glyphs");
     62             break;
     63         case SkPaint::kUTF32_TextEncoding:
     64             break;
     65     }
     66 }
     67 
     68 ///////////////////////////////////////////////////////////////////////////////
     69 
     70 void SkLuaCanvas::pushThis() {
     71     SkLua(fL).pushCanvas(this);
     72 }
     73 
     74 ///////////////////////////////////////////////////////////////////////////////
     75 
     76 SkLuaCanvas::SkLuaCanvas(int width, int height, lua_State* L, const char func[])
     77     : INHERITED(width, height)
     78     , fL(L)
     79     , fFunc(func) {
     80 }
     81 
     82 SkLuaCanvas::~SkLuaCanvas() {}
     83 
     84 void SkLuaCanvas::willSave() {
     85     AUTO_LUA("save");
     86     this->INHERITED::willSave();
     87 }
     88 
     89 SkCanvas::SaveLayerStrategy SkLuaCanvas::willSaveLayer(const SkRect* bounds, const SkPaint* paint,
     90                                                        SaveFlags flags) {
     91     AUTO_LUA("saveLayer");
     92     if (bounds) {
     93         lua.pushRect(*bounds, "bounds");
     94     }
     95     if (paint) {
     96         lua.pushPaint(*paint, "paint");
     97     }
     98 
     99     this->INHERITED::willSaveLayer(bounds, paint, flags);
    100     // No need for a layer.
    101     return kNoLayer_SaveLayerStrategy;
    102 }
    103 
    104 void SkLuaCanvas::willRestore() {
    105     AUTO_LUA("restore");
    106     this->INHERITED::willRestore();
    107 }
    108 
    109 void SkLuaCanvas::didConcat(const SkMatrix& matrix) {
    110     switch (matrix.getType()) {
    111         case SkMatrix::kTranslate_Mask: {
    112             AUTO_LUA("translate");
    113             lua.pushScalar(matrix.getTranslateX(), "dx");
    114             lua.pushScalar(matrix.getTranslateY(), "dy");
    115             break;
    116         }
    117         case SkMatrix::kScale_Mask: {
    118             AUTO_LUA("scale");
    119             lua.pushScalar(matrix.getScaleX(), "sx");
    120             lua.pushScalar(matrix.getScaleY(), "sy");
    121             break;
    122         }
    123         default: {
    124             AUTO_LUA("concat");
    125             // pushMatrix added in https://codereview.chromium.org/203203004/
    126             // Doesn't seem to have ever been working correctly since added
    127             // lua.pushMatrix(matrix);
    128             break;
    129         }
    130     }
    131 
    132     this->INHERITED::didConcat(matrix);
    133 }
    134 
    135 void SkLuaCanvas::didSetMatrix(const SkMatrix& matrix) {
    136     this->INHERITED::didSetMatrix(matrix);
    137 }
    138 
    139 void SkLuaCanvas::onClipRect(const SkRect& r, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
    140     AUTO_LUA("clipRect");
    141     lua.pushRect(r, "rect");
    142     lua.pushBool(kSoft_ClipEdgeStyle == edgeStyle, "aa");
    143     this->INHERITED::onClipRect(r, op, edgeStyle);
    144 }
    145 
    146 void SkLuaCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
    147     AUTO_LUA("clipRRect");
    148     lua.pushRRect(rrect, "rrect");
    149     lua.pushBool(kSoft_ClipEdgeStyle == edgeStyle, "aa");
    150     this->INHERITED::onClipRRect(rrect, op, edgeStyle);
    151 }
    152 
    153 void SkLuaCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
    154     AUTO_LUA("clipPath");
    155     lua.pushPath(path, "path");
    156     lua.pushBool(kSoft_ClipEdgeStyle == edgeStyle, "aa");
    157     this->INHERITED::onClipPath(path, op, edgeStyle);
    158 }
    159 
    160 void SkLuaCanvas::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
    161     AUTO_LUA("clipRegion");
    162     this->INHERITED::onClipRegion(deviceRgn, op);
    163 }
    164 
    165 void SkLuaCanvas::drawPaint(const SkPaint& paint) {
    166     AUTO_LUA("drawPaint");
    167     lua.pushPaint(paint, "paint");
    168 }
    169 
    170 void SkLuaCanvas::drawPoints(PointMode mode, size_t count,
    171                                const SkPoint pts[], const SkPaint& paint) {
    172     AUTO_LUA("drawPoints");
    173     lua.pushArrayPoint(pts, SkToInt(count), "points");
    174     lua.pushPaint(paint, "paint");
    175 }
    176 
    177 void SkLuaCanvas::drawOval(const SkRect& rect, const SkPaint& paint) {
    178     AUTO_LUA("drawOval");
    179     lua.pushRect(rect, "rect");
    180     lua.pushPaint(paint, "paint");
    181 }
    182 
    183 void SkLuaCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
    184     AUTO_LUA("drawRect");
    185     lua.pushRect(rect, "rect");
    186     lua.pushPaint(paint, "paint");
    187 }
    188 
    189 void SkLuaCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
    190     AUTO_LUA("drawRRect");
    191     lua.pushRRect(rrect, "rrect");
    192     lua.pushPaint(paint, "paint");
    193 }
    194 
    195 void SkLuaCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
    196                                const SkPaint& paint) {
    197     AUTO_LUA("drawDRRect");
    198     lua.pushRRect(outer, "outer");
    199     lua.pushRRect(inner, "inner");
    200     lua.pushPaint(paint, "paint");
    201 }
    202 
    203 void SkLuaCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
    204     AUTO_LUA("drawPath");
    205     lua.pushPath(path, "path");
    206     lua.pushPaint(paint, "paint");
    207 }
    208 
    209 void SkLuaCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
    210                              const SkPaint* paint) {
    211     AUTO_LUA("drawBitmap");
    212     if (paint) {
    213         lua.pushPaint(*paint, "paint");
    214     }
    215 }
    216 
    217 void SkLuaCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
    218                                        const SkRect& dst, const SkPaint* paint,
    219                                        DrawBitmapRectFlags flags) {
    220     AUTO_LUA("drawBitmapRectToRect");
    221     if (paint) {
    222         lua.pushPaint(*paint, "paint");
    223     }
    224 }
    225 
    226 void SkLuaCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
    227                                    const SkPaint* paint) {
    228     AUTO_LUA("drawBitmapMatrix");
    229     if (paint) {
    230         lua.pushPaint(*paint, "paint");
    231     }
    232 }
    233 
    234 void SkLuaCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
    235                                const SkPaint* paint) {
    236     AUTO_LUA("drawSprite");
    237     if (paint) {
    238         lua.pushPaint(*paint, "paint");
    239     }
    240 }
    241 
    242 void SkLuaCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
    243                              const SkPaint& paint) {
    244     AUTO_LUA("drawText");
    245     lua.pushEncodedText(paint.getTextEncoding(), text, byteLength);
    246     lua.pushPaint(paint, "paint");
    247 }
    248 
    249 void SkLuaCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
    250                                 const SkPaint& paint) {
    251     AUTO_LUA("drawPosText");
    252     lua.pushEncodedText(paint.getTextEncoding(), text, byteLength);
    253     lua.pushPaint(paint, "paint");
    254 }
    255 
    256 void SkLuaCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
    257                                  SkScalar constY, const SkPaint& paint) {
    258     AUTO_LUA("drawPosTextH");
    259     lua.pushEncodedText(paint.getTextEncoding(), text, byteLength);
    260     lua.pushPaint(paint, "paint");
    261 }
    262 
    263 void SkLuaCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
    264                                    const SkMatrix* matrix, const SkPaint& paint) {
    265     AUTO_LUA("drawTextOnPath");
    266     lua.pushPath(path, "path");
    267     lua.pushEncodedText(paint.getTextEncoding(), text, byteLength);
    268     lua.pushPaint(paint, "paint");
    269 }
    270 
    271 void SkLuaCanvas::onDrawTextBlob(const SkTextBlob *blob, SkScalar x, SkScalar y,
    272                                  const SkPaint &paint) {
    273     AUTO_LUA("drawTextBlob");
    274     lua.pushTextBlob(blob, "blob");
    275     lua.pushScalar(x, "x");
    276     lua.pushScalar(y, "y");
    277     lua.pushPaint(paint, "paint");
    278 }
    279 
    280 void SkLuaCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix,
    281                                 const SkPaint* paint) {
    282     AUTO_LUA("drawPicture");
    283     // call through so we can see the nested picture ops
    284     this->INHERITED::onDrawPicture(picture, matrix, paint);
    285 }
    286 
    287 void SkLuaCanvas::drawVertices(VertexMode vmode, int vertexCount,
    288                                  const SkPoint vertices[], const SkPoint texs[],
    289                                  const SkColor colors[], SkXfermode* xmode,
    290                                  const uint16_t indices[], int indexCount,
    291                                  const SkPaint& paint) {
    292     AUTO_LUA("drawVertices");
    293     lua.pushPaint(paint, "paint");
    294 }
    295 
    296 void SkLuaCanvas::drawData(const void* data, size_t length) {
    297     AUTO_LUA("drawData");
    298 }
    299