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, length >> 1, "glyphs");
     61             break;
     62         case SkPaint::kUTF32_TextEncoding:
     63             break;
     64     }
     65 }
     66 
     67 ///////////////////////////////////////////////////////////////////////////////
     68 
     69 void SkLuaCanvas::pushThis() {
     70     SkLua(fL).pushCanvas(this);
     71 }
     72 
     73 ///////////////////////////////////////////////////////////////////////////////
     74 
     75 static SkBitmap make_bm(int width, int height) {
     76     SkBitmap bm;
     77     bm.setConfig(SkBitmap::kNo_Config, width, height);
     78     return bm;
     79 }
     80 
     81 SkLuaCanvas::SkLuaCanvas(int width, int height, lua_State* L, const char func[])
     82     : INHERITED(make_bm(width, height))
     83     , fL(L)
     84     , fFunc(func) {
     85 }
     86 
     87 SkLuaCanvas::~SkLuaCanvas() {}
     88 
     89 int SkLuaCanvas::save(SaveFlags flags) {
     90     AUTO_LUA("save");
     91     return this->INHERITED::save(flags);
     92 }
     93 
     94 int SkLuaCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
     95                              SaveFlags flags) {
     96     AUTO_LUA("saveLayer");
     97     if (bounds) {
     98         lua.pushRect(*bounds, "bounds");
     99     }
    100     if (paint) {
    101         lua.pushPaint(*paint, "paint");
    102     }
    103     return this->INHERITED::save(flags);
    104 }
    105 
    106 void SkLuaCanvas::restore() {
    107     AUTO_LUA("restore");
    108     this->INHERITED::restore();
    109 }
    110 
    111 bool SkLuaCanvas::translate(SkScalar dx, SkScalar dy) {
    112     AUTO_LUA("translate");
    113     lua.pushScalar(dx, "dx");
    114     lua.pushScalar(dy, "dy");
    115     return this->INHERITED::translate(dx, dy);
    116 }
    117 
    118 bool SkLuaCanvas::scale(SkScalar sx, SkScalar sy) {
    119     AUTO_LUA("scale");
    120     lua.pushScalar(sx, "sx");
    121     lua.pushScalar(sy, "sy");
    122     return this->INHERITED::scale(sx, sy);
    123 }
    124 
    125 bool SkLuaCanvas::rotate(SkScalar degrees) {
    126     AUTO_LUA("rotate");
    127     lua.pushScalar(degrees, "degrees");
    128     return this->INHERITED::rotate(degrees);
    129 }
    130 
    131 bool SkLuaCanvas::skew(SkScalar kx, SkScalar ky) {
    132     AUTO_LUA("skew");
    133     lua.pushScalar(kx, "kx");
    134     lua.pushScalar(ky, "ky");
    135     return this->INHERITED::skew(kx, ky);
    136 }
    137 
    138 bool SkLuaCanvas::concat(const SkMatrix& matrix) {
    139     AUTO_LUA("concat");
    140     return this->INHERITED::concat(matrix);
    141 }
    142 
    143 void SkLuaCanvas::setMatrix(const SkMatrix& matrix) {
    144     this->INHERITED::setMatrix(matrix);
    145 }
    146 
    147 bool SkLuaCanvas::clipRect(const SkRect& r, SkRegion::Op op, bool doAA) {
    148     AUTO_LUA("clipRect");
    149     lua.pushRect(r, "rect");
    150     lua.pushBool(doAA, "aa");
    151     return this->INHERITED::clipRect(r, op, doAA);
    152 }
    153 
    154 bool SkLuaCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
    155     AUTO_LUA("clipRRect");
    156     lua.pushRRect(rrect, "rrect");
    157     lua.pushBool(doAA, "aa");
    158     return this->INHERITED::clipRRect(rrect, op, doAA);
    159 }
    160 
    161 bool SkLuaCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
    162     AUTO_LUA("clipPath");
    163     lua.pushPath(path, "path");
    164     lua.pushBool(doAA, "aa");
    165     return this->INHERITED::clipPath(path, op, doAA);
    166 }
    167 
    168 bool SkLuaCanvas::clipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
    169     AUTO_LUA("clipRegion");
    170     return this->INHERITED::clipRegion(deviceRgn, op);
    171 }
    172 
    173 void SkLuaCanvas::drawPaint(const SkPaint& paint) {
    174     AUTO_LUA("drawPaint");
    175     lua.pushPaint(paint, "paint");
    176 }
    177 
    178 void SkLuaCanvas::drawPoints(PointMode mode, size_t count,
    179                                const SkPoint pts[], const SkPaint& paint) {
    180     AUTO_LUA("drawPoints");
    181     lua.pushPaint(paint, "paint");
    182 }
    183 
    184 void SkLuaCanvas::drawOval(const SkRect& rect, const SkPaint& paint) {
    185     AUTO_LUA("drawOval");
    186     lua.pushRect(rect, "rect");
    187     lua.pushPaint(paint, "paint");
    188 }
    189 
    190 void SkLuaCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
    191     AUTO_LUA("drawRect");
    192     lua.pushRect(rect, "rect");
    193     lua.pushPaint(paint, "paint");
    194 }
    195 
    196 void SkLuaCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
    197     AUTO_LUA("drawRRect");
    198     lua.pushRRect(rrect, "rrect");
    199     lua.pushPaint(paint, "paint");
    200 }
    201 
    202 void SkLuaCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
    203     AUTO_LUA("drawPath");
    204     lua.pushPath(path, "path");
    205     lua.pushPaint(paint, "paint");
    206 }
    207 
    208 void SkLuaCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
    209                                const SkPaint* paint) {
    210     AUTO_LUA("drawBitmap");
    211     if (paint) {
    212         lua.pushPaint(*paint, "paint");
    213     }
    214 }
    215 
    216 void SkLuaCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
    217                                    const SkRect& dst, const SkPaint* paint) {
    218     AUTO_LUA("drawBitmapRectToRect");
    219     if (paint) {
    220         lua.pushPaint(*paint, "paint");
    221     }
    222 }
    223 
    224 void SkLuaCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
    225                                      const SkPaint* paint) {
    226     AUTO_LUA("drawBitmapMatrix");
    227     if (paint) {
    228         lua.pushPaint(*paint, "paint");
    229     }
    230 }
    231 
    232 void SkLuaCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
    233                                const SkPaint* paint) {
    234     AUTO_LUA("drawSprite");
    235     if (paint) {
    236         lua.pushPaint(*paint, "paint");
    237     }
    238 }
    239 
    240 void SkLuaCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
    241                              SkScalar y, const SkPaint& paint) {
    242     AUTO_LUA("drawText");
    243     lua.pushEncodedText(paint.getTextEncoding(), text, byteLength);
    244     lua.pushPaint(paint, "paint");
    245 }
    246 
    247 void SkLuaCanvas::drawPosText(const void* text, size_t byteLength,
    248                                 const SkPoint pos[], const SkPaint& paint) {
    249     AUTO_LUA("drawPosText");
    250     lua.pushEncodedText(paint.getTextEncoding(), text, byteLength);
    251     lua.pushPaint(paint, "paint");
    252 }
    253 
    254 void SkLuaCanvas::drawPosTextH(const void* text, size_t byteLength,
    255                                  const SkScalar xpos[], SkScalar constY,
    256                                  const SkPaint& paint) {
    257     AUTO_LUA("drawPosTextH");
    258     lua.pushEncodedText(paint.getTextEncoding(), text, byteLength);
    259     lua.pushPaint(paint, "paint");
    260 }
    261 
    262 void SkLuaCanvas::drawTextOnPath(const void* text, size_t byteLength,
    263                                    const SkPath& path, const SkMatrix* matrix,
    264                                    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::drawPicture(SkPicture& picture) {
    272     AUTO_LUA("drawPicture");
    273     // call through so we can see the nested picture ops
    274     this->INHERITED::drawPicture(picture);
    275 }
    276 
    277 void SkLuaCanvas::drawVertices(VertexMode vmode, int vertexCount,
    278                                  const SkPoint vertices[], const SkPoint texs[],
    279                                  const SkColor colors[], SkXfermode* xmode,
    280                                  const uint16_t indices[], int indexCount,
    281                                  const SkPaint& paint) {
    282     AUTO_LUA("drawVertices");
    283     lua.pushPaint(paint, "paint");
    284 }
    285 
    286 void SkLuaCanvas::drawData(const void* data, size_t length) {
    287     AUTO_LUA("drawData");
    288 }
    289