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

Side by Side Diff: src/utils/SkLua.cpp

Issue 650263002: add pictures to lua (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 2 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 unified diff | Download patch
« no previous file with comments | « resources/slides.lua ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkLua.h" 8 #include "SkLua.h"
9 9
10 #if SK_SUPPORT_GPU 10 #if SK_SUPPORT_GPU
11 #include "GrReducedClip.h" 11 #include "GrReducedClip.h"
12 #endif 12 #endif
13 13
14 #include "SkCanvas.h" 14 #include "SkCanvas.h"
15 #include "SkData.h" 15 #include "SkData.h"
16 #include "SkDecodingImageGenerator.h" 16 #include "SkDecodingImageGenerator.h"
17 #include "SkDocument.h" 17 #include "SkDocument.h"
18 #include "SkImage.h" 18 #include "SkImage.h"
19 #include "SkMatrix.h" 19 #include "SkMatrix.h"
20 #include "SkPaint.h" 20 #include "SkPaint.h"
21 #include "SkPath.h" 21 #include "SkPath.h"
22 #include "SkPictureRecorder.h"
22 #include "SkPixelRef.h" 23 #include "SkPixelRef.h"
23 #include "SkRRect.h" 24 #include "SkRRect.h"
24 #include "SkString.h" 25 #include "SkString.h"
25 #include "SkSurface.h" 26 #include "SkSurface.h"
26 #include "SkTextBlob.h" 27 #include "SkTextBlob.h"
27 #include "SkTypeface.h" 28 #include "SkTypeface.h"
28 29
29 extern "C" { 30 extern "C" {
30 #include "lua.h" 31 #include "lua.h"
31 #include "lualib.h" 32 #include "lualib.h"
32 #include "lauxlib.h" 33 #include "lauxlib.h"
33 } 34 }
34 35
35 // return the metatable name for a given class 36 // return the metatable name for a given class
36 template <typename T> const char* get_mtname(); 37 template <typename T> const char* get_mtname();
37 #define DEF_MTNAME(T) \ 38 #define DEF_MTNAME(T) \
38 template <> const char* get_mtname<T>() { \ 39 template <> const char* get_mtname<T>() { \
39 return #T "_LuaMetaTableName"; \ 40 return #T "_LuaMetaTableName"; \
40 } 41 }
41 42
42 DEF_MTNAME(SkCanvas) 43 DEF_MTNAME(SkCanvas)
43 DEF_MTNAME(SkDocument) 44 DEF_MTNAME(SkDocument)
44 DEF_MTNAME(SkImage) 45 DEF_MTNAME(SkImage)
45 DEF_MTNAME(SkMatrix) 46 DEF_MTNAME(SkMatrix)
46 DEF_MTNAME(SkRRect) 47 DEF_MTNAME(SkRRect)
47 DEF_MTNAME(SkPath) 48 DEF_MTNAME(SkPath)
48 DEF_MTNAME(SkPaint) 49 DEF_MTNAME(SkPaint)
49 DEF_MTNAME(SkPathEffect) 50 DEF_MTNAME(SkPathEffect)
51 DEF_MTNAME(SkPicture)
52 DEF_MTNAME(SkPictureRecorder)
50 DEF_MTNAME(SkShader) 53 DEF_MTNAME(SkShader)
51 DEF_MTNAME(SkSurface) 54 DEF_MTNAME(SkSurface)
52 DEF_MTNAME(SkTextBlob) 55 DEF_MTNAME(SkTextBlob)
53 DEF_MTNAME(SkTypeface) 56 DEF_MTNAME(SkTypeface)
54 57
55 template <typename T> T* push_new(lua_State* L) { 58 template <typename T> T* push_new(lua_State* L) {
56 T* addr = (T*)lua_newuserdata(L, sizeof(T)); 59 T* addr = (T*)lua_newuserdata(L, sizeof(T));
57 new (addr) T; 60 new (addr) T;
58 luaL_getmetatable(L, get_mtname<T>()); 61 luaL_getmetatable(L, get_mtname<T>());
59 lua_setmetatable(L, -2); 62 lua_setmetatable(L, -2);
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 canvas->drawImageRect(image, srcRPtr, dstR, lua2OptionalPaint(L, 5, &paint)) ; 505 canvas->drawImageRect(image, srcRPtr, dstR, lua2OptionalPaint(L, 5, &paint)) ;
503 return 0; 506 return 0;
504 } 507 }
505 508
506 static int lcanvas_drawPath(lua_State* L) { 509 static int lcanvas_drawPath(lua_State* L) {
507 get_ref<SkCanvas>(L, 1)->drawPath(*get_obj<SkPath>(L, 2), 510 get_ref<SkCanvas>(L, 1)->drawPath(*get_obj<SkPath>(L, 2),
508 *get_obj<SkPaint>(L, 3)); 511 *get_obj<SkPaint>(L, 3));
509 return 0; 512 return 0;
510 } 513 }
511 514
515 // drawPicture(pic, x, y, paint)
516 static int lcanvas_drawPicture(lua_State* L) {
517 SkCanvas* canvas = get_ref<SkCanvas>(L, 1);
518 SkPicture* picture = get_ref<SkPicture>(L, 2);
519 SkScalar x = lua2scalar_def(L, 3, 0);
520 SkScalar y = lua2scalar_def(L, 4, 0);
521 SkMatrix matrix, *matrixPtr = NULL;
522 if (x || y) {
523 matrix.setTranslate(x, y);
524 matrixPtr = &matrix;
525 }
526 SkPaint paint;
527 canvas->drawPicture(picture, matrixPtr, lua2OptionalPaint(L, 5, &paint));
528 return 0;
529 }
530
512 static int lcanvas_drawText(lua_State* L) { 531 static int lcanvas_drawText(lua_State* L) {
513 if (lua_gettop(L) < 5) { 532 if (lua_gettop(L) < 5) {
514 return 0; 533 return 0;
515 } 534 }
516 535
517 if (lua_isstring(L, 2) && lua_isnumber(L, 3) && lua_isnumber(L, 4)) { 536 if (lua_isstring(L, 2) && lua_isnumber(L, 3) && lua_isnumber(L, 4)) {
518 size_t len; 537 size_t len;
519 const char* text = lua_tolstring(L, 2, &len); 538 const char* text = lua_tolstring(L, 2, &len);
520 get_ref<SkCanvas>(L, 1)->drawText(text, len, 539 get_ref<SkCanvas>(L, 1)->drawText(text, len,
521 lua2scalar(L, 3), lua2scalar(L, 4), 540 lua2scalar(L, 3), lua2scalar(L, 4),
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 648
630 const struct luaL_Reg gSkCanvas_Methods[] = { 649 const struct luaL_Reg gSkCanvas_Methods[] = {
631 { "clear", lcanvas_clear }, 650 { "clear", lcanvas_clear },
632 { "drawColor", lcanvas_drawColor }, 651 { "drawColor", lcanvas_drawColor },
633 { "drawRect", lcanvas_drawRect }, 652 { "drawRect", lcanvas_drawRect },
634 { "drawOval", lcanvas_drawOval }, 653 { "drawOval", lcanvas_drawOval },
635 { "drawCircle", lcanvas_drawCircle }, 654 { "drawCircle", lcanvas_drawCircle },
636 { "drawImage", lcanvas_drawImage }, 655 { "drawImage", lcanvas_drawImage },
637 { "drawImageRect", lcanvas_drawImageRect }, 656 { "drawImageRect", lcanvas_drawImageRect },
638 { "drawPath", lcanvas_drawPath }, 657 { "drawPath", lcanvas_drawPath },
658 { "drawPicture", lcanvas_drawPicture },
639 { "drawText", lcanvas_drawText }, 659 { "drawText", lcanvas_drawText },
640 { "getSaveCount", lcanvas_getSaveCount }, 660 { "getSaveCount", lcanvas_getSaveCount },
641 { "getTotalMatrix", lcanvas_getTotalMatrix }, 661 { "getTotalMatrix", lcanvas_getTotalMatrix },
642 { "getClipStack", lcanvas_getClipStack }, 662 { "getClipStack", lcanvas_getClipStack },
643 #if SK_SUPPORT_GPU 663 #if SK_SUPPORT_GPU
644 { "getReducedClipStack", SkLua::lcanvas_getReducedClipStack }, 664 { "getReducedClipStack", SkLua::lcanvas_getReducedClipStack },
645 #endif 665 #endif
646 { "save", lcanvas_save }, 666 { "save", lcanvas_save },
647 { "restore", lcanvas_restore }, 667 { "restore", lcanvas_restore },
648 { "scale", lcanvas_scale }, 668 { "scale", lcanvas_scale },
(...skipping 810 matching lines...) Expand 10 before | Expand all | Expand 10 after
1459 lua_pushnil(L); 1479 lua_pushnil(L);
1460 } else { 1480 } else {
1461 push_ref(L, image); 1481 push_ref(L, image);
1462 image->unref(); 1482 image->unref();
1463 } 1483 }
1464 return 1; 1484 return 1;
1465 } 1485 }
1466 1486
1467 static int lsurface_newSurface(lua_State* L) { 1487 static int lsurface_newSurface(lua_State* L) {
1468 int width = lua2int_def(L, 2, 0); 1488 int width = lua2int_def(L, 2, 0);
1469 int height = lua2int_def(L, 2, 0); 1489 int height = lua2int_def(L, 3, 0);
1470 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height); 1490 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
1471 SkSurface* surface = get_ref<SkSurface>(L, 1)->newSurface(info); 1491 SkSurface* surface = get_ref<SkSurface>(L, 1)->newSurface(info);
1472 if (NULL == surface) { 1492 if (NULL == surface) {
1473 lua_pushnil(L); 1493 lua_pushnil(L);
1474 } else { 1494 } else {
1475 push_ref(L, surface); 1495 push_ref(L, surface);
1476 surface->unref(); 1496 surface->unref();
1477 } 1497 }
1478 return 1; 1498 return 1;
1479 } 1499 }
1480 1500
1481 static int lsurface_gc(lua_State* L) { 1501 static int lsurface_gc(lua_State* L) {
1482 get_ref<SkSurface>(L, 1)->unref(); 1502 get_ref<SkSurface>(L, 1)->unref();
1483 return 0; 1503 return 0;
1484 } 1504 }
1485 1505
1486 static const struct luaL_Reg gSkSurface_Methods[] = { 1506 static const struct luaL_Reg gSkSurface_Methods[] = {
1487 { "width", lsurface_width }, 1507 { "width", lsurface_width },
1488 { "height", lsurface_height }, 1508 { "height", lsurface_height },
1489 { "getCanvas", lsurface_getCanvas }, 1509 { "getCanvas", lsurface_getCanvas },
1490 { "newImageSnapshot", lsurface_newImageSnapshot }, 1510 { "newImageSnapshot", lsurface_newImageSnapshot },
1491 { "newSurface", lsurface_newSurface }, 1511 { "newSurface", lsurface_newSurface },
1492 { "__gc", lsurface_gc }, 1512 { "__gc", lsurface_gc },
1493 { NULL, NULL } 1513 { NULL, NULL }
1494 }; 1514 };
1495 1515
1496 /////////////////////////////////////////////////////////////////////////////// 1516 ///////////////////////////////////////////////////////////////////////////////
1497 1517
1518 static int lpicturerecorder_beginRecording(lua_State* L) {
1519 const SkScalar w = lua2scalar_def(L, 2, -1);
1520 const SkScalar h = lua2scalar_def(L, 3, -1);
1521 if (w <= 0 || h <= 0) {
1522 lua_pushnil(L);
1523 return 1;
1524 }
1525
1526 SkCanvas* canvas = get_obj<SkPictureRecorder>(L, 1)->beginRecording(w, h);
1527 if (NULL == canvas) {
1528 lua_pushnil(L);
1529 return 1;
1530 }
1531
1532 push_ref(L, canvas);
1533 return 1;
1534 }
1535
1536 static int lpicturerecorder_getCanvas(lua_State* L) {
1537 SkCanvas* canvas = get_obj<SkPictureRecorder>(L, 1)->getRecordingCanvas();
1538 if (NULL == canvas) {
1539 lua_pushnil(L);
1540 return 1;
1541 }
1542 push_ref(L, canvas);
1543 return 1;
1544 }
1545
1546 static int lpicturerecorder_endRecording(lua_State* L) {
1547 SkPicture* pic = get_obj<SkPictureRecorder>(L, 1)->endRecording();
1548 if (NULL == pic) {
1549 lua_pushnil(L);
1550 return 1;
1551 }
1552 push_ref(L, pic);
1553 pic->unref(); // lua is the only owner, so we unref ours
1554 return 1;
1555 }
1556
1557 static int lpicturerecorder_gc(lua_State* L) {
1558 get_obj<SkPictureRecorder>(L, 1)->~SkPictureRecorder();
1559 return 0;
1560 }
1561
1562 static const struct luaL_Reg gSkPictureRecorder_Methods[] = {
1563 { "beginRecording", lpicturerecorder_beginRecording },
1564 { "getCanvas", lpicturerecorder_getCanvas },
1565 { "endRecording", lpicturerecorder_endRecording },
1566 { "__gc", lpicturerecorder_gc },
1567 { NULL, NULL }
1568 };
1569
1570 ///////////////////////////////////////////////////////////////////////////////
1571
robertphillips 2014/10/13 18:31:59 float ?
reed1 2014/10/13 18:34:37 the lua function returns the number of arguments i
1572 static int lpicture_width(lua_State* L) {
1573 lua_pushnumber(L, get_ref<SkPicture>(L, 1)->cullRect().width());
1574 return 1;
1575 }
1576
robertphillips 2014/10/13 18:31:59 float ?
1577 static int lpicture_height(lua_State* L) {
1578 lua_pushnumber(L, get_ref<SkPicture>(L, 1)->cullRect().height());
1579 return 1;
1580 }
1581
1582 static int lpicture_gc(lua_State* L) {
1583 get_ref<SkPicture>(L, 1)->unref();
1584 return 0;
1585 }
1586
1587 static const struct luaL_Reg gSkPicture_Methods[] = {
1588 { "width", lpicture_width },
1589 { "height", lpicture_height },
1590 { "__gc", lpicture_gc },
1591 { NULL, NULL }
1592 };
1593
1594 ///////////////////////////////////////////////////////////////////////////////
1595
1498 static int ltypeface_gc(lua_State* L) { 1596 static int ltypeface_gc(lua_State* L) {
1499 SkSafeUnref(get_ref<SkTypeface>(L, 1)); 1597 SkSafeUnref(get_ref<SkTypeface>(L, 1));
1500 return 0; 1598 return 0;
1501 } 1599 }
1502 1600
1503 static const struct luaL_Reg gSkTypeface_Methods[] = { 1601 static const struct luaL_Reg gSkTypeface_Methods[] = {
1504 { "__gc", ltypeface_gc }, 1602 { "__gc", ltypeface_gc },
1505 { NULL, NULL } 1603 { NULL, NULL }
1506 }; 1604 };
1507 1605
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1555 static int lsk_newPaint(lua_State* L) { 1653 static int lsk_newPaint(lua_State* L) {
1556 push_new<SkPaint>(L); 1654 push_new<SkPaint>(L);
1557 return 1; 1655 return 1;
1558 } 1656 }
1559 1657
1560 static int lsk_newPath(lua_State* L) { 1658 static int lsk_newPath(lua_State* L) {
1561 push_new<SkPath>(L); 1659 push_new<SkPath>(L);
1562 return 1; 1660 return 1;
1563 } 1661 }
1564 1662
1663 static int lsk_newPictureRecorder(lua_State* L) {
1664 push_new<SkPictureRecorder>(L);
1665 return 1;
1666 }
1667
1565 static int lsk_newRRect(lua_State* L) { 1668 static int lsk_newRRect(lua_State* L) {
1566 SkRRect* rr = push_new<SkRRect>(L); 1669 SkRRect* rr = push_new<SkRRect>(L);
1567 rr->setEmpty(); 1670 rr->setEmpty();
1568 return 1; 1671 return 1;
1569 } 1672 }
1570 1673
1571 static int lsk_newTypeface(lua_State* L) { 1674 static int lsk_newTypeface(lua_State* L) {
1572 const char* name = NULL; 1675 const char* name = NULL;
1573 int style = SkTypeface::kNormal; 1676 int style = SkTypeface::kNormal;
1574 1677
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1626 static void register_Sk(lua_State* L) { 1729 static void register_Sk(lua_State* L) {
1627 lua_newtable(L); 1730 lua_newtable(L);
1628 lua_pushvalue(L, -1); 1731 lua_pushvalue(L, -1);
1629 lua_setglobal(L, "Sk"); 1732 lua_setglobal(L, "Sk");
1630 // the Sk table is still on top 1733 // the Sk table is still on top
1631 1734
1632 setfield_function(L, "newDocumentPDF", lsk_newDocumentPDF); 1735 setfield_function(L, "newDocumentPDF", lsk_newDocumentPDF);
1633 setfield_function(L, "loadImage", lsk_loadImage); 1736 setfield_function(L, "loadImage", lsk_loadImage);
1634 setfield_function(L, "newPaint", lsk_newPaint); 1737 setfield_function(L, "newPaint", lsk_newPaint);
1635 setfield_function(L, "newPath", lsk_newPath); 1738 setfield_function(L, "newPath", lsk_newPath);
1739 setfield_function(L, "newPictureRecorder", lsk_newPictureRecorder);
1636 setfield_function(L, "newRRect", lsk_newRRect); 1740 setfield_function(L, "newRRect", lsk_newRRect);
1637 setfield_function(L, "newRasterSurface", lsk_newRasterSurface); 1741 setfield_function(L, "newRasterSurface", lsk_newRasterSurface);
1638 setfield_function(L, "newTypeface", lsk_newTypeface); 1742 setfield_function(L, "newTypeface", lsk_newTypeface);
1639 lua_pop(L, 1); // pop off the Sk table 1743 lua_pop(L, 1); // pop off the Sk table
1640 } 1744 }
1641 1745
1642 #define REG_CLASS(L, C) \ 1746 #define REG_CLASS(L, C) \
1643 do { \ 1747 do { \
1644 luaL_newmetatable(L, get_mtname<C>()); \ 1748 luaL_newmetatable(L, get_mtname<C>()); \
1645 lua_pushvalue(L, -1); \ 1749 lua_pushvalue(L, -1); \
1646 lua_setfield(L, -2, "__index"); \ 1750 lua_setfield(L, -2, "__index"); \
1647 luaL_setfuncs(L, g##C##_Methods, 0); \ 1751 luaL_setfuncs(L, g##C##_Methods, 0); \
1648 lua_pop(L, 1); /* pop off the meta-table */ \ 1752 lua_pop(L, 1); /* pop off the meta-table */ \
1649 } while (0) 1753 } while (0)
1650 1754
1651 void SkLua::Load(lua_State* L) { 1755 void SkLua::Load(lua_State* L) {
1652 register_Sk(L); 1756 register_Sk(L);
1653 REG_CLASS(L, SkCanvas); 1757 REG_CLASS(L, SkCanvas);
1654 REG_CLASS(L, SkDocument); 1758 REG_CLASS(L, SkDocument);
1655 REG_CLASS(L, SkImage); 1759 REG_CLASS(L, SkImage);
1656 REG_CLASS(L, SkPaint); 1760 REG_CLASS(L, SkPaint);
1657 REG_CLASS(L, SkPath); 1761 REG_CLASS(L, SkPath);
1658 REG_CLASS(L, SkPathEffect); 1762 REG_CLASS(L, SkPathEffect);
1763 REG_CLASS(L, SkPicture);
1764 REG_CLASS(L, SkPictureRecorder);
1659 REG_CLASS(L, SkRRect); 1765 REG_CLASS(L, SkRRect);
1660 REG_CLASS(L, SkShader); 1766 REG_CLASS(L, SkShader);
1661 REG_CLASS(L, SkSurface); 1767 REG_CLASS(L, SkSurface);
1662 REG_CLASS(L, SkTypeface); 1768 REG_CLASS(L, SkTypeface);
1663 REG_CLASS(L, SkMatrix); 1769 REG_CLASS(L, SkMatrix);
1664 } 1770 }
1665 1771
1666 extern "C" int luaopen_skia(lua_State* L); 1772 extern "C" int luaopen_skia(lua_State* L);
1667 extern "C" int luaopen_skia(lua_State* L) { 1773 extern "C" int luaopen_skia(lua_State* L) {
1668 SkLua::Load(L); 1774 SkLua::Load(L);
1669 return 0; 1775 return 0;
1670 } 1776 }
OLDNEW
« no previous file with comments | « resources/slides.lua ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698