diff options
| author | scuri <scuri> | 2008-10-17 06:10:33 +0000 | 
|---|---|---|
| committer | scuri <scuri> | 2008-10-17 06:10:33 +0000 | 
| commit | 7b52cc13af4e85f1ca2deb6b6c77de9c95ea0dcf (patch) | |
| tree | d0857278bde2eff784227c57dcaf930346ceb7ac /src/lua5/cdlua5_canvas.c | |
First commit - moving from LuaForge to SourceForge
Diffstat (limited to 'src/lua5/cdlua5_canvas.c')
| -rw-r--r-- | src/lua5/cdlua5_canvas.c | 2343 | 
1 files changed, 2343 insertions, 0 deletions
| diff --git a/src/lua5/cdlua5_canvas.c b/src/lua5/cdlua5_canvas.c new file mode 100644 index 0000000..8800123 --- /dev/null +++ b/src/lua5/cdlua5_canvas.c @@ -0,0 +1,2343 @@ +/** \file + * \brief Lua Binding of the Canvas dependent API + * + * See Copyright Notice in cd.h + */ + + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "cd.h" +#include "wd.h" +#include "cdirgb.h" + +#include <lua.h> +#include <lauxlib.h> + +#include "cdlua.h" +#include "cdlua5_private.h" + +#define _cdCheckCanvas(_canvas) (_canvas!=NULL && ((unsigned char*)_canvas)[0] == 'C' && ((unsigned char*)_canvas)[1] == 'D') + + +void cdlua_pushcanvas(lua_State * L, cdCanvas* canvas) +{ +  cdCanvas* *canvas_p = (cdCanvas* *) lua_newuserdata(L, sizeof(cdCanvas*)); +  *canvas_p = canvas; +  luaL_getmetatable(L, "cdCanvas"); +  lua_setmetatable(L, -2); +} + +cdCanvas* cdlua_checkcanvas(lua_State * L, int pos) +{ +  cdCanvas* *canvas_p = (cdCanvas**)luaL_checkudata(L, pos, "cdCanvas"); +  if (!(*canvas_p)) +    luaL_argerror(L, pos, "killed cdCanvas"); +  if (!_cdCheckCanvas(*canvas_p)) +    luaL_argerror(L, pos, "invalid Lua object, killed cdCanvas in C but not in Lua"); +  return *canvas_p; +} + +cdCanvas* cdlua_getcanvas(lua_State * L) +{ +  return cdlua_checkcanvas(L, 1); +} + +static int cdlua5_createcanvas(lua_State * L)  +{ +  cdluaContext* cdlua_ctx = cdlua_getcontext(L, 1); +  void *data_p = cdlua_ctx->checkdata(L, 2); + +  cdCanvas* canvas = cdCreateCanvas(cdlua_ctx->ctx(), data_p); +   +  /* if creation failed, return nil so that the user can compare */ +  /* the result with nil and know that it failed */ +  if (canvas)  +    cdlua_pushcanvas(L, canvas); +  else +    lua_pushnil(L); + +  return 1; +} + +static int cdlua5_killcanvas(lua_State *L) +{ +  cdCanvas* *canvas_p = (cdCanvas**) luaL_checkudata(L, 1, "cdCanvas"); +  if (!(*canvas_p)) +    luaL_argerror(L, 1, "killed cdCanvas"); +  if (!_cdCheckCanvas(*canvas_p)) +    luaL_argerror(L, 1, "invalid Lua object, killed cdCanvas in C but not in Lua"); + +  cdlua_kill_active(L, *canvas_p); + +  cdKillCanvas(*canvas_p); +  *canvas_p = NULL;   /* mark as killed */ + +  return 0; +} + +static int cdluaCanvas_eq (lua_State *L) +{ +  cdCanvas* canvas1 = cdlua_checkcanvas(L, 1); +  cdCanvas* canvas2 = cdlua_checkcanvas(L, 2); +  lua_pushboolean(L, canvas1 == canvas2); +  return 1; +} + +static int cdluaCanvas_tostring (lua_State *L) +{ +  cdCanvas* *canvas_p = (cdCanvas**) luaL_checkudata(L, 1, "cdCanvas"); +  if (!(*canvas_p)) +    lua_pushfstring(L, "cdCanvas(%p - NULL)-killed", canvas_p); +  else if (!_cdCheckCanvas(*canvas_p)) +    lua_pushfstring(L, "cdCanvas(%p - INVALID)-killed in C but not in Lua", canvas_p); +  else +    lua_pushfstring(L, "cdCanvas(%p - %p)", canvas_p, *canvas_p); +  return 1; +} + +static int cdlua5_getcontext(lua_State * L) +{ +  cdluaLuaState* cdL; +  cdContext* ctx; +  int i; +  int driver = -1; +  cdCanvas* canvas = cdlua_checkcanvas(L, 1); + +  ctx = cdCanvasGetContext(canvas); +  cdL = cdlua_getstate(L); + +  for (i=0; i < cdL->numdrivers; i++) +  { +    if (ctx == cdL->drivers[i]->ctx()) +    { +      driver = i; +      break; +    } +  } + +  if (i == cdL->numdrivers) +    luaL_argerror(L, 1, "unknown driver"); + +  lua_pushnumber(L, driver); +  return 1; +} + +/***************************************************************************\ +* Activates a cd canvas.                                                    * +\***************************************************************************/ +static int cdlua5_activate(lua_State * L) +{ +  lua_pushnumber(L, cdCanvasActivate(cdlua_checkcanvas(L, 1))); +  return 1; +} + +static int cdlua5_deactivate(lua_State * L) +{ +  cdCanvasDeactivate(cdlua_checkcanvas(L, 1)); +  return 0; +} + +/***************************************************************************\ +* cd.Simulate(mode: number) -> (old_mode: number)                           * +\***************************************************************************/ +static int cdlua5_simulate(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasSimulate(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2))); +  return 1; +} + +/***************************************************************************\ +* Control                                                                   * +\***************************************************************************/ + +/***************************************************************************\ +* cd.Clear()                                                                * +\***************************************************************************/ +static int cdlua5_clear(lua_State *L) +{ +  cdCanvasClear(cdlua_checkcanvas(L, 1)); +  return 0; +} + +/***************************************************************************\ +* cd.Flush()                                                                * +\***************************************************************************/ +static int cdlua5_flush(lua_State *L) +{ +  cdCanvasFlush(cdlua_checkcanvas(L, 1)); +  return 0; +} + +static int cdlua5_savestate(lua_State *L) +{ +  cdState* state = cdCanvasSaveState(cdlua_checkcanvas(L, 1)); +  if (state) +    cdlua_pushstate(L, state); +  else +    lua_pushnil(L); +  return 1; +} + +static int cdlua5_restorestate(lua_State * L) +{ +  cdCanvasRestoreState(cdlua_checkcanvas(L, 1), cdlua_checkstate(L, 2)); +  return 0; +} + +static int cdlua_isuserdata(const char* name) +{ +  if (strcmp(name, "HDC")==0) return 1; +  if (strcmp(name, "GC")==0) return 1; +  return 0; +} + +/***************************************************************************\ +* cd.SetAttribute(name, data: string)                                       * +\***************************************************************************/ +static int cdlua5_setattribute(lua_State *L) +{ +  const char* name = luaL_checkstring(L, 2); +    +  if (lua_isnil(L, 2)) +  { +    cdCanvasSetAttribute(cdlua_checkcanvas(L, 1), name, NULL); +  } +  else +  { +    char* data; +    if (cdlua_isuserdata(name)) +      data = (char*) lua_touserdata(L, 3); +    else +      data = (char*) luaL_checkstring(L, 3); +    cdCanvasSetAttribute(cdlua_checkcanvas(L, 1), name, data); +  } +  return 0; +} + + +/***************************************************************************\ +* cd.SetAttribute(name: string) -> (data: string)                           * +\***************************************************************************/ +static int cdlua5_getattribute(lua_State *L) +{ +  const char* name = luaL_checkstring(L, 2); +  char* data = cdCanvasGetAttribute(cdlua_checkcanvas(L, 1), name); +  if (data) +  { +    if (cdlua_isuserdata(name)) +      lua_pushlightuserdata(L, data); +    else +      lua_pushstring(L, data); +  } +  else +    lua_pushnil(L); +  return 1; +} + + + +/***************************************************************************\ +* Coordinate System                                                         * +\***************************************************************************/ + +/***************************************************************************\ +* cd.GetCanvasSize() -> (width, heigth, mm_width, mm_height: number)        * +\***************************************************************************/ +static int cdlua5_getcanvassize(lua_State *L) +{ +  int width; +  int height; +  double mm_width; +  double mm_height; + +  cdCanvasGetSize(cdlua_checkcanvas(L, 1), &width, &height, &mm_width, &mm_height); +   +  lua_pushnumber(L, width); +  lua_pushnumber(L, height); +  lua_pushnumber(L, mm_width); +  lua_pushnumber(L, mm_height); +  return 4; +} + +/***************************************************************************\ +* cd.UpdateYAxis(yc: number) -> (yr: number)                                * +\***************************************************************************/ +static int cdlua5_updateyaxis(lua_State *L) +{ +  double y = luaL_checknumber(L, 2); +  cdfCanvasUpdateYAxis(cdlua_checkcanvas(L, 1), &y); +  lua_pushnumber(L, y); +  return 1; +} + +static int cdlua5_invertyaxis(lua_State *L) +{ +  lua_pushnumber(L, cdfCanvasInvertYAxis(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2))); +  return 1; +} + +static int cdlua5_mm2pixel(lua_State *L) +{ +  double mm_dx, mm_dy; +  int dx, dy; + +  mm_dx = luaL_checknumber(L,2); +  mm_dy =  luaL_checknumber(L,3); + +  cdCanvasMM2Pixel(cdlua_checkcanvas(L, 1), mm_dx, mm_dy, &dx, &dy); +  lua_pushnumber(L, dx); +  lua_pushnumber(L, dy); +  return 2; +} + +static int cdlua5_pixel2mm(lua_State *L) +{ +  double mm_dx_d, mm_dy_d; +  int dx, dy; + +  dx = luaL_checkint(L,2); +  dy = luaL_checkint(L,3); + +  cdCanvasPixel2MM(cdlua_checkcanvas(L, 1), dx, dy, &mm_dx_d, &mm_dy_d); +  lua_pushnumber(L, mm_dx_d); +  lua_pushnumber(L, mm_dy_d); +  return 2; +} + +static int cdlua5_fmm2pixel(lua_State *L) +{ +  double mm_dx, mm_dy; +  double dx, dy; + +  mm_dx = luaL_checknumber(L,2); +  mm_dy =  luaL_checknumber(L,3); + +  cdfCanvasMM2Pixel(cdlua_checkcanvas(L, 1), mm_dx, mm_dy, &dx, &dy); +  lua_pushnumber(L, dx); +  lua_pushnumber(L, dy); +  return 2; +} + +static int cdlua5_fpixel2mm(lua_State *L) +{ +  double mm_dx_d, mm_dy_d; +  double dx, dy; + +  dx = luaL_checknumber(L,2); +  dy = luaL_checknumber(L,3); + +  cdfCanvasPixel2MM(cdlua_checkcanvas(L, 1), dx, dy, &mm_dx_d, &mm_dy_d); +  lua_pushnumber(L, mm_dx_d); +  lua_pushnumber(L, mm_dy_d); +  return 2; +} + +static int cdlua5_origin(lua_State *L) +{ +  cdCanvasOrigin(cdlua_checkcanvas(L, 1), luaL_checkint(L,2), luaL_checkint(L,3)); +  return 0; +} + +static int cdlua5_getorigin(lua_State *L) +{ +  int x, y; +  cdCanvasGetOrigin(cdlua_checkcanvas(L, 1), &x, &y); +  lua_pushnumber(L, x); +  lua_pushnumber(L, y); +  return 2; +} + +static int cdlua5_forigin(lua_State *L) +{ +  cdfCanvasOrigin(cdlua_checkcanvas(L, 1), luaL_checknumber(L,2), luaL_checknumber(L,3)); +  return 0; +} + +static int cdlua5_fgetorigin(lua_State *L) +{ +  double x, y; +  cdfCanvasGetOrigin(cdlua_checkcanvas(L, 1), &x, &y); +  lua_pushnumber(L, x); +  lua_pushnumber(L, y); +  return 2; +} + +static int cdlua5_transform(lua_State *L) +{ +  double matrix[6]; +  int i; + +  if (!lua_istable(L, 2)) +    luaL_argerror(L, 2, "invalid matrix, must be a table"); + +  for (i=0; i < 6; i++) +  { +    lua_rawgeti(L, 2, i+1); + +    if (!lua_isnumber(L, -1)) +      luaL_argerror(L, 2, "invalid matrix value, must be a number"); + +    matrix[i] = lua_tonumber(L, -1); +    lua_pop(L, 1); +  } + +  cdCanvasTransform(cdlua_checkcanvas(L, 1), matrix); +  return 0; +} + +static int cdlua5_gettransform(lua_State *L) +{ +  int i; +  double* matrix = cdCanvasGetTransform(cdlua_checkcanvas(L, 1)); +  lua_newtable(L); +  for (i=0; i < 6; i++) +  { +    lua_pushnumber(L, matrix[i]); +    lua_rawseti(L, 1, i+1); +  } +  return 1; +} + +static int cdlua5_transformmultiply(lua_State *L) +{ +  double matrix[6]; +  int i; + +  if (!lua_istable(L, 2)) +    luaL_argerror(L, 2, "invalid matrix, must be a table"); + +  for (i=0; i < 6; i++) +  { +    lua_rawgeti(L, 2, i+1); + +    if (!lua_isnumber(L, -1)) +      luaL_argerror(L, 1, "invalid matrix value, must be a number"); + +    matrix[i] = lua_tonumber(L, -1); +    lua_pop(L, 1); +  } + +  cdCanvasTransformMultiply(cdlua_checkcanvas(L, 1), matrix); +  return 0; +} + +static int cdlua5_transformrotate(lua_State *L) +{ +  cdCanvasTransformRotate(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2)); +  return 0; +} + +static int cdlua5_transformscale(lua_State *L) +{ +  cdCanvasTransformScale(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3)); +  return 0; +} + +static int cdlua5_transformtranslate(lua_State *L) +{ +  cdCanvasTransformTranslate(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3)); +  return 0; +} + +static int cdlua5_transformpoint(lua_State *L) +{ +  int x, y; +  cdCanvasTransformPoint(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2), luaL_checkint(L, 3), &x, &y); +  lua_pushnumber(L, x); +  lua_pushnumber(L, y); +  return 2; +} + +static int cdlua5_ftransformpoint(lua_State *L) +{ +  double x, y; +  cdfCanvasTransformPoint(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3), &x, &y); +  lua_pushnumber(L, x); +  lua_pushnumber(L, y); +  return 2; +} + +/***************************************************************************\ +* World Coordinates                                                         * +\***************************************************************************/ + +/***************************************************************************\ +* wd.Window(xmin, xmax, ymin, ymax: number)                                 * +\***************************************************************************/ +static int wdlua5_window(lua_State *L) +{ +  double xmin = luaL_checknumber(L, 2); +  double xmax = luaL_checknumber(L, 3); +  double ymin = luaL_checknumber(L, 4); +  double ymax = luaL_checknumber(L, 5); +  wdCanvasWindow(cdlua_checkcanvas(L, 1), xmin, xmax, ymin, ymax); +  return 0; +} + +/***************************************************************************\ +* wd.GetWindow() -> (xmin, xmax, ymin, ymax: number)                        * +\***************************************************************************/ +static int wdlua5_getwindow(lua_State *L) +{ +  double xmin, xmax, ymin, ymax; + +  wdCanvasGetWindow(cdlua_checkcanvas(L, 1), &xmin, &xmax, &ymin, &ymax); +  lua_pushnumber(L, xmin); +  lua_pushnumber(L, xmax); +  lua_pushnumber(L, ymin); +  lua_pushnumber(L, ymax); +  return 4; +} + +/***************************************************************************\ +* wd.Viewport(xmin, xmax, ymin, ymax: number)                               * +\***************************************************************************/ +static int wdlua5_viewport(lua_State *L) +{ +  int xmin = luaL_checkint(L, 2); +  int xmax = luaL_checkint(L, 3); +  int ymin = luaL_checkint(L, 4); +  int ymax = luaL_checkint(L, 5); +  wdCanvasViewport(cdlua_checkcanvas(L, 1), xmin, xmax, ymin, ymax); +  return 0; +} + +/***************************************************************************\ +* wd.GetViewport() -> (xmin, xmax, ymin, ymax: number                       * +\***************************************************************************/ +static int wdlua5_getviewport(lua_State *L) +{ +  int xmin, xmax, ymin, ymax; + +  wdCanvasGetViewport(cdlua_checkcanvas(L, 1), &xmin, &xmax, &ymin, &ymax); +  lua_pushnumber(L, xmin); +  lua_pushnumber(L, xmax); +  lua_pushnumber(L, ymin); +  lua_pushnumber(L, ymax); +  return 4; +} + +/***************************************************************************\ +* wd.World2Canvas(xw, yw: number) -> (xv, yv: number)                       * +\***************************************************************************/ +static int wdlua5_world2canvas(lua_State *L) +{ +  double xw_d, yw_d; +  int xv_i, yv_i; + +  xw_d = luaL_checknumber(L, 2); +  yw_d = luaL_checknumber(L, 3); + +  wdCanvasWorld2Canvas(cdlua_checkcanvas(L, 1), xw_d, yw_d, &xv_i, &yv_i); +  lua_pushnumber(L, xv_i); +  lua_pushnumber(L, yv_i); +  return 2; +} + +/***************************************************************************\ +* wd.Canvas2World(xv, yv: number) -> (xw, yw: number)                       * +\***************************************************************************/ +static int wdlua5_canvas2world(lua_State *L) +{ +  int xv_i, yv_i; +  double xw_d, yw_d; + +  xv_i = luaL_checkint(L, 2); +  yv_i = luaL_checkint(L, 3); + +  wdCanvasCanvas2World(cdlua_checkcanvas(L, 1), xv_i, yv_i, &xw_d, &yw_d); +  lua_pushnumber(L, xw_d); +  lua_pushnumber(L, yw_d); +  return 2; +} + + + +/***************************************************************************\ +* General Attributes                                                        * +\***************************************************************************/ + +/***************************************************************************\ +* cd.Foreground(color) -> color                                             * +\***************************************************************************/ +static int cdlua5_foreground(lua_State *L) +{ +  long int color_i = cdlua_checkcolor(L, 1); +  color_i = cdCanvasForeground(cdlua_checkcanvas(L, 1), color_i); +  lua_pushlightuserdata(L, (void*) color_i); +  return 1; +} + +static int cdlua5_setforeground(lua_State *L) +{ +  long int color_i = cdlua_checkcolor(L, 1); +  cdCanvasSetForeground(cdlua_checkcanvas(L, 1), color_i); +  return 0; +} + +/***************************************************************************\ +* cd.Background(color) -> color                                             * +\***************************************************************************/ +static int cdlua5_background(lua_State *L) +{ +  long int color_i = cdlua_checkcolor(L, 1); +  color_i = cdCanvasBackground(cdlua_checkcanvas(L, 1), color_i); +  lua_pushlightuserdata(L, (void*) color_i); +  return 1; +} + +static int cdlua5_setbackground(lua_State *L) +{ +  long int color_i = cdlua_checkcolor(L, 1); +  cdCanvasSetBackground(cdlua_checkcanvas(L, 1), color_i); +  return 0; +} +/***************************************************************************\ +* cd.WriteMode(mode: number) -> (old_mode: number)                          * +\***************************************************************************/ +static int cdlua5_writemode(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasWriteMode(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2))); +  return 1; +} + + + +/***************************************************************************\ +* Clipping                                                                  * +\***************************************************************************/ + +/***************************************************************************\ +* cd.Clip(mode: number) -> (old_mode: number)                               * +\***************************************************************************/ +static int cdlua5_clip(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasClip(cdlua_checkcanvas(L, 1), luaL_checkint(L,2))); +  return 1; +} + +static int cdlua5_cliparea(lua_State *L) +{ +  int xmin = luaL_checkint(L, 2); +  int xmax = luaL_checkint(L, 3); +  int ymin = luaL_checkint(L, 4); +  int ymax = luaL_checkint(L, 5); + +  cdCanvasClipArea(cdlua_checkcanvas(L, 1), xmin, xmax, ymin, ymax); +  return 0; +} + +static int wdlua5_cliparea(lua_State *L) +{ +  double xmin = luaL_checknumber(L, 2); +  double xmax = luaL_checknumber(L, 3); +  double ymin = luaL_checknumber(L, 4); +  double ymax = luaL_checknumber(L, 5); + +  wdCanvasClipArea(cdlua_checkcanvas(L, 1), xmin, xmax, ymin, ymax); +  return 0; +} + +static int cdlua5_fcliparea(lua_State *L) +{ +  double xmin = luaL_checknumber(L, 2); +  double xmax = luaL_checknumber(L, 3); +  double ymin = luaL_checknumber(L, 4); +  double ymax = luaL_checknumber(L, 5); + +  cdfCanvasClipArea(cdlua_checkcanvas(L, 1), xmin, xmax, ymin, ymax); +  return 0; +} + +static int cdlua5_getcliparea(lua_State *L) +{ +  int xmin, xmax, ymin, ymax; +  int status; + +  status = cdCanvasGetClipArea(cdlua_checkcanvas(L, 1), &xmin, &xmax, &ymin, &ymax); +  lua_pushnumber(L, xmin); +  lua_pushnumber(L, xmax); +  lua_pushnumber(L, ymin); +  lua_pushnumber(L, ymax); +  lua_pushnumber(L, status); +  return 5; +} + +static int wdlua5_getcliparea(lua_State *L) +{ +  double xmin, xmax, ymin, ymax; +  int status; + +  status = wdCanvasGetClipArea(cdlua_checkcanvas(L, 1), &xmin, &xmax, &ymin, &ymax); +  lua_pushnumber(L, xmin); +  lua_pushnumber(L, xmax); +  lua_pushnumber(L, ymin); +  lua_pushnumber(L, ymax); +  lua_pushnumber(L, status); +  return 5; +} + +static int cdlua5_fgetcliparea(lua_State *L) +{ +  double xmin, xmax, ymin, ymax; +  int status; + +  status = cdfCanvasGetClipArea(cdlua_checkcanvas(L, 1), &xmin, &xmax, &ymin, &ymax); +  lua_pushnumber(L, xmin); +  lua_pushnumber(L, xmax); +  lua_pushnumber(L, ymin); +  lua_pushnumber(L, ymax); +  lua_pushnumber(L, status); +  return 5; +} + +/***************************************************************************\ +* Regions                                                                   * +\***************************************************************************/ + +/***************************************************************************\ +* cd.RegionCombineMode(mode: number) -> (old_mode: number)                  * +\***************************************************************************/ +static int cdlua5_regioncombinemode(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasRegionCombineMode(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2))); +  return 1; +} + +/***************************************************************************\ +* cd.PointInRegion(x, y: number) -> (status: number)                        * +\***************************************************************************/ +static int  cdlua5_pointinregion(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasIsPointInRegion(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2), luaL_checkint(L, 3))); +  return 1; +} + +/***************************************************************************\ +* cd.wPointInRegion(x, y: number) -> (status: number)                       * +\***************************************************************************/ +static int wdlua5_pointinregion(lua_State *L) +{ +  lua_pushnumber(L, wdCanvasIsPointInRegion(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3))); +  return 1; +} + +/***************************************************************************\ +* cd.OffsetRegion(dx, dy: number)                                           * +\***************************************************************************/ +static int cdlua5_offsetregion(lua_State *L) +{ +  cdCanvasOffsetRegion(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2), luaL_checkint(L, 3)); +  return 0; +} + +/***************************************************************************\ +* cd.wOffsetRegion(dx, dy: number)                                          * +\***************************************************************************/ +static int wdlua5_offsetregion(lua_State *L) +{ +  wdCanvasOffsetRegion(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3)); +  return 0; +} + +/***************************************************************************\ +* cd.RegionBox() -> (xmin, xmax, ymin, ymax, status: number)                * +\***************************************************************************/ +static int cdlua5_regionbox(lua_State *L) +{ +  int xmin, xmax, ymin, ymax; +   +  cdCanvasGetRegionBox(cdlua_checkcanvas(L, 1), &xmin, &xmax, &ymin, &ymax); +  lua_pushnumber(L, xmin); +  lua_pushnumber(L, xmax); +  lua_pushnumber(L, ymin); +  lua_pushnumber(L, ymax); +  return 4; +} + +/***************************************************************************\ +* cd.wRegionBox() -> (xmin, xmax, ymin, ymax, status: number)               * +\***************************************************************************/ +static int wdlua5_regionbox(lua_State *L) +{ +  double xmin, xmax, ymin, ymax; + +  wdCanvasGetRegionBox(cdlua_checkcanvas(L, 1), &xmin, &xmax, &ymin, &ymax); +  lua_pushnumber(L, xmin); +  lua_pushnumber(L, xmax); +  lua_pushnumber(L, ymin); +  lua_pushnumber(L, ymax); +  return 4; +} + + +/***************************************************************************\ +* Primitives                                                                * +\***************************************************************************/ + +/***************************************************************************\ +* cd.Pixel(x, y: number, color)                                             * +\***************************************************************************/ +static int cdlua5_pixel (lua_State *L) +{ +  cdCanvasPixel(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2), luaL_checkint(L, 3), cdlua_checkcolor(L, 4)); +  return 0 ; +} + +/***************************************************************************\ +* cd.wPixel(x, y: number, color)                                            * +\***************************************************************************/ +static int wdlua5_pixel (lua_State *L) +{ +  wdCanvasPixel(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3), cdlua_checkcolor(L, 4)); +  return 0; +} + +/***************************************************************************\ +* cd.Mark(x, y: number)                                                     * +\***************************************************************************/ +static int cdlua5_mark(lua_State *L) +{ +  cdCanvasMark(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2), luaL_checkint(L, 3)); +  return 0; +} + +/***************************************************************************\ +* cd.wMark(x, y: number)                                                    * +\***************************************************************************/ +static int wdlua5_mark(lua_State *L) +{ +  wdCanvasMark(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3)); +  return 0; +} + +/***************************************************************************\ +* cd.MarkType(type: number) -> (old_type: number)                           * +\***************************************************************************/ +static int cdlua5_marktype(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasMarkType(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2))); +  return 1; +} + +/***************************************************************************\ +* cd.MarkSize(size: number) -> (old_size: number)                           * +\***************************************************************************/ +static int cdlua5_marksize(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasMarkSize(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2))); +  return 1; +} + +/***************************************************************************\ +* cd.wMarkSize(size: number) -> (old_size: number)                          * +\***************************************************************************/ +static int wdlua5_marksize(lua_State *L) +{ +  lua_pushnumber(L, wdCanvasMarkSize(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2))); +  return 1; +} + + + +/***************************************************************************\ +* Lines                                                                     * +\***************************************************************************/ + +static int cdlua5_line(lua_State *L) +{ +  int x1 = luaL_checkint(L,2); +  int y1 = luaL_checkint(L,3); +  int x2 = luaL_checkint(L,4); +  int y2 = luaL_checkint(L,5); +  cdCanvasLine(cdlua_checkcanvas(L, 1), x1, y1, x2, y2); +  return 0; +} + +static int wdlua5_line(lua_State *L) +{ +  double x1 = luaL_checknumber(L, 2); +  double y1 = luaL_checknumber(L, 3); +  double x2 = luaL_checknumber(L, 4); +  double y2 = luaL_checknumber(L, 5); +  wdCanvasLine(cdlua_checkcanvas(L, 1), x1, y1, x2, y2); +  return 0; +} + +static int cdlua5_fline(lua_State *L) +{ +  double x1 = luaL_checknumber(L, 2); +  double y1 = luaL_checknumber(L, 3); +  double x2 = luaL_checknumber(L, 4); +  double y2 = luaL_checknumber(L, 5); +  cdfCanvasLine(cdlua_checkcanvas(L, 1), x1, y1, x2, y2); +  return 0; +} + +static int cdlua5_rect(lua_State *L) +{ +  int xmin = luaL_checkint(L,2); +  int xmax = luaL_checkint(L,3); +  int ymin = luaL_checkint(L,4); +  int ymax = luaL_checkint(L,5); +  cdCanvasRect(cdlua_checkcanvas(L, 1), xmin, xmax, ymin, ymax); +  return 0; +} + +static int wdlua5_rect(lua_State *L) +{ +  double xmin = luaL_checknumber(L, 2); +  double xmax = luaL_checknumber(L, 3); +  double ymin = luaL_checknumber(L, 4); +  double ymax = luaL_checknumber(L, 5); +  wdCanvasRect(cdlua_checkcanvas(L, 1), xmin,xmax,ymin,ymax); +  return 0; +} + +static int cdlua5_frect(lua_State *L) +{ +  double xmin = luaL_checknumber(L, 2); +  double xmax = luaL_checknumber(L, 3); +  double ymin = luaL_checknumber(L, 4); +  double ymax = luaL_checknumber(L, 5); +  cdfCanvasRect(cdlua_checkcanvas(L, 1), xmin,xmax,ymin,ymax); +  return 0; +} + +static int cdlua5_arc(lua_State *L) +{ +  int xc = luaL_checkint(L,2); +  int yc = luaL_checkint(L,3); +  int w = luaL_checkint(L,4); +  int h = luaL_checkint(L,5); +  double angle1 = luaL_checknumber(L,6); +  double angle2 = luaL_checknumber(L,7); +  cdCanvasArc(cdlua_checkcanvas(L, 1), xc, yc, w, h, angle1, angle2); +  return 0; +} + +static int wdlua5_arc(lua_State *L) +{ +  double xc = luaL_checknumber(L, 2); +  double yc = luaL_checknumber(L, 3); +  double w = luaL_checknumber(L, 4); +  double h = luaL_checknumber(L, 5); +  double angle1 = luaL_checknumber(L, 6); +  double angle2 = luaL_checknumber(L, 7); +  wdCanvasArc(cdlua_checkcanvas(L, 1), xc, yc, w, h, angle1, angle2); +  return 0; +} + +static int cdlua5_farc(lua_State *L) +{ +  double xc = luaL_checknumber(L, 2); +  double yc = luaL_checknumber(L, 3); +  double w = luaL_checknumber(L, 4); +  double h = luaL_checknumber(L, 5); +  double angle1 = luaL_checknumber(L, 6); +  double angle2 = luaL_checknumber(L, 7); +  cdfCanvasArc(cdlua_checkcanvas(L, 1), xc, yc, w, h, angle1, angle2); +  return 0; +} + +/***************************************************************************\ +* cd.LineStyle(style: number) -> (old_style: number)                        * +\***************************************************************************/ +static int cdlua5_linestyle(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasLineStyle(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2))); +  return 1; +} + +/***************************************************************************\ +* cd.LineStyleDashes(dashes: table, count: number)                          * +\***************************************************************************/ +static int cdlua5_linestyledashes(lua_State *L) +{ +  int *dashes_int, dashes_count, i; + +  if (!lua_istable(L, 2)) +    luaL_argerror(L, 2, "invalid dashes, must be a table"); + +  dashes_count = luaL_checkint(L, 3); +  dashes_int = (int*) malloc(dashes_count * sizeof(int)); + +  for (i=0; i < dashes_count; i++) +  { +    lua_pushnumber(L, i+1); +    lua_gettable(L, 2); + +    dashes_int[i] = luaL_checkint(L,-1); +  } + +  cdCanvasLineStyleDashes(cdlua_checkcanvas(L, 1), dashes_int, dashes_count); +  free(dashes_int); + +  return 0; +} + +/***************************************************************************\ +* cd.LineWidth(width: number) -> (old_width: number)                        * +\***************************************************************************/ +static int cdlua5_linewidth(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasLineWidth(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2))); +  return 1; +} + +/***************************************************************************\ +* cd.wLineWidth(width: number) -> (old_width: number)                       * +\***************************************************************************/ +static int wdlua5_linewidth(lua_State *L) +{ +  lua_pushnumber(L, wdCanvasLineWidth(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2))); +  return 1; +} + +/***************************************************************************\ +* cd.LineJoin(style: number) -> (old_style: number)                         * +\***************************************************************************/ +static int cdlua5_linejoin(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasLineJoin(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2))); +  return 1; +} + +/***************************************************************************\ +* cd.LineCap(style: number) -> (old_style: number)                          * +\***************************************************************************/ +static int cdlua5_linecap(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasLineCap(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2))); +  return 1; +} + + + +/***************************************************************************\ +* Filled Areas                                                              * +\***************************************************************************/ + +static int cdlua5_box(lua_State *L) +{ +  int xmin = luaL_checkint(L, 2); +  int xmax = luaL_checkint(L, 3); +  int ymin = luaL_checkint(L, 4); +  int ymax = luaL_checkint(L, 5); +  cdCanvasBox(cdlua_checkcanvas(L, 1), xmin, xmax, ymin, ymax); +  return 0; +} + +static int wdlua5_box(lua_State *L) +{ +  double xmin = luaL_checknumber(L, 2); +  double xmax = luaL_checknumber(L, 3); +  double ymin = luaL_checknumber(L, 4); +  double ymax = luaL_checknumber(L, 5); +  wdCanvasBox(cdlua_checkcanvas(L, 1), xmin, xmax, ymin, ymax); +  return 0; +} + +static int cdlua5_fbox(lua_State *L) +{ +  double xmin = luaL_checknumber(L, 2); +  double xmax = luaL_checknumber(L, 3); +  double ymin = luaL_checknumber(L, 4); +  double ymax = luaL_checknumber(L, 5); +  cdfCanvasBox(cdlua_checkcanvas(L, 1), xmin, xmax, ymin, ymax); +  return 0; +} + +static int cdlua5_sector(lua_State *L) +{ +  int xc = luaL_checkint(L,2); +  int yc = luaL_checkint(L,3); +  int w = luaL_checkint(L,4); +  int h = luaL_checkint(L,5); +  double angle1 = luaL_checknumber(L,6); +  double angle2 = luaL_checknumber(L,7); +  cdCanvasSector(cdlua_checkcanvas(L, 1), xc, yc, w, h, angle1, angle2); +  return 0; +} + +static int wdlua5_sector(lua_State *L) +{ +  double xc = luaL_checknumber(L, 2); +  double yc = luaL_checknumber(L, 3); +  double w = luaL_checknumber(L, 4); +  double h = luaL_checknumber(L, 5); +  double angle1 = luaL_checknumber(L, 6); +  double angle2 = luaL_checknumber(L, 7); +  wdCanvasSector(cdlua_checkcanvas(L, 1), xc, yc, w, h, angle1, angle2); +  return 0; +} + +static int cdlua5_fsector(lua_State *L) +{ +  double xc = luaL_checknumber(L, 2); +  double yc = luaL_checknumber(L, 3); +  double w = luaL_checknumber(L, 4); +  double h = luaL_checknumber(L, 5); +  double angle1 = luaL_checknumber(L, 6); +  double angle2 = luaL_checknumber(L, 7); +  cdfCanvasSector(cdlua_checkcanvas(L, 1), xc, yc, w, h, angle1, angle2); +  return 0; +} + +static int cdlua5_chord(lua_State *L) +{ +  int xc = luaL_checkint(L,2); +  int yc = luaL_checkint(L,3); +  int w = luaL_checkint(L,4); +  int h = luaL_checkint(L,5); +  double angle1 = luaL_checknumber(L,6); +  double angle2 = luaL_checknumber(L,7); +  cdCanvasChord(cdlua_checkcanvas(L, 1), xc, yc, w, h, angle1, angle2); +  return 0; +} + +static int wdlua5_chord(lua_State *L) +{ +  double xc = luaL_checknumber(L, 2); +  double yc = luaL_checknumber(L, 3); +  double w = luaL_checknumber(L, 4); +  double h = luaL_checknumber(L, 5); +  double angle1 = luaL_checknumber(L, 6); +  double angle2 = luaL_checknumber(L, 7); +  wdCanvasChord(cdlua_checkcanvas(L, 1), xc, yc, w, h, angle1, angle2); +  return 0; +} + +static int cdlua5_fchord(lua_State *L) +{ +  double xc = luaL_checknumber(L, 2); +  double yc = luaL_checknumber(L, 3); +  double w = luaL_checknumber(L, 4); +  double h = luaL_checknumber(L, 5); +  double angle1 = luaL_checknumber(L, 6); +  double angle2 = luaL_checknumber(L, 7); +  cdfCanvasChord(cdlua_checkcanvas(L, 1), xc, yc, w, h, angle1, angle2); +  return 0; +} + +/***************************************************************************\ +* cd.BackOpacity(opacity: number) -> (old_opacity: number)                  * +\***************************************************************************/ +static int cdlua5_backopacity(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasBackOpacity(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2))); +  return 1; +} + +/***************************************************************************\ +* cd.FillMode(mode: number) -> (old_mode: number)                           * +\***************************************************************************/ +static int cdlua5_fillmode(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasFillMode(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2))); +  return 1; +} + +/***************************************************************************\ +* cd.InteriorStyle(style: number) -> (old_style: number)                    * +\***************************************************************************/ +static int cdlua5_interiorstyle(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasInteriorStyle(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2))); +  return 1; +} + +/***************************************************************************\ +* cd.Hatch(style: number) -> (old_style: number)                            * +\***************************************************************************/ +static int cdlua5_hatch(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasHatch(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2))); +  return 1; +} + +static int cdlua5_stipple(lua_State *L) +{ +  cdluaStipple *stipple_p = cdlua_checkstipple(L, 2); +  cdCanvasStipple(cdlua_checkcanvas(L, 1), stipple_p->width, stipple_p->height, stipple_p->stipple); +  return 0 ; +} + +static int wdlua5_stipple(lua_State *L) +{ +  cdluaStipple *stipple_p = cdlua_checkstipple(L, 2); +  double w_mm = luaL_checknumber(L, 3); +  double h_mm = luaL_checknumber(L, 4); +  wdCanvasStipple(cdlua_checkcanvas(L, 1), stipple_p->width, stipple_p->height, stipple_p->stipple, w_mm, h_mm); +  return 0; +} + +static int cdlua5_getstipple(lua_State *L) +{ +  int width, height, size; +  unsigned char *stipple, *new_stipple = NULL; + +  stipple = cdCanvasGetStipple(cdlua_checkcanvas(L, 1), &width, &height); + +  size = width * height; + +  if (stipple) +    new_stipple = (unsigned char *)malloc(size); + +  if (new_stipple)  +  { +    memcpy(new_stipple, stipple, size);   +    cdlua_pushstipple(L, new_stipple, width, height); +  } +  else +    lua_pushnil(L); + +  return 1; +} + +static int cdlua5_pattern(lua_State *L) +{ +  cdluaPattern* pattern_p = cdlua_checkpattern(L, 2); +  cdCanvasPattern(cdlua_checkcanvas(L, 1), pattern_p->width, pattern_p->height, pattern_p->pattern); +  return 0; +} + +static int wdlua5_pattern(lua_State *L) +{ +  cdluaPattern* pattern_p = cdlua_checkpattern(L, 2); +  double w_mm = luaL_checknumber(L, 3); +  double h_mm = luaL_checknumber(L, 4); +  wdCanvasPattern(cdlua_checkcanvas(L, 1), pattern_p->width, pattern_p->height, pattern_p->pattern, w_mm, h_mm); +  return 0; +} + +static int cdlua5_getpattern(lua_State *L) +{ +  int width, height, size; +  long int *pattern, *new_pattern = NULL; + +  pattern = cdCanvasGetPattern(cdlua_checkcanvas(L, 1), &width, &height); + +  size = width * height; + +  if (pattern) +    new_pattern = (long int *) malloc(size * sizeof(long int)); + +  if (new_pattern) +  { +    memcpy(new_pattern, pattern, size * sizeof(long int)); +    cdlua_pushpattern(L, new_pattern, width, height); +  } +  else +    lua_pushnil(L); + +  return 1; +} + +/***************************************************************************\ +* Text                                                                      * +\***************************************************************************/ + +static int cdlua5_text(lua_State *L) +{ +  const char* s = luaL_checkstring(L, 4); +  cdCanvasText(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2), luaL_checkint(L, 3), s); +  return 0; +} + +static int wdlua5_text(lua_State *L) +{ +  const char* s = luaL_checkstring(L, 4); +  wdCanvasText(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3), s); +  return 0; +} + +static int cdlua5_ftext(lua_State *L) +{ +  const char* s = luaL_checkstring(L, 4); +  cdfCanvasText(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3), s); +  return 0; +} + +/***************************************************************************\ +* cd.Font(typeface, style, size: number)                                    * +\***************************************************************************/ +static int cdlua5_font(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasFont(cdlua_checkcanvas(L, 1), luaL_checkstring(L, 2), luaL_checkint(L, 3), luaL_checkint(L, 4))); +  return 1; +} + +/***************************************************************************\ +* cd.wFont(typeface, style, size: number)                                   * +\***************************************************************************/ +static int wdlua5_font(lua_State *L) +{ +  lua_pushnumber(L, wdCanvasFont(cdlua_checkcanvas(L, 1), luaL_checkstring(L, 2), luaL_checkint(L, 3), luaL_checknumber(L, 4))); +  return 1; +} + + +/***************************************************************************\ +* cd.GetFont() -> (typeface, style, size: number)                           * +\***************************************************************************/ +static int cdlua5_getfont(lua_State *L) +{ +  char type_face[1024]; +  int style, size; + +  cdCanvasGetFont(cdlua_checkcanvas(L, 1), type_face, &style, &size); +  lua_pushstring(L, type_face); +  lua_pushnumber(L, style); +  lua_pushnumber(L, size); +  return 3; +} + +/***************************************************************************\ +* cd.wGetFont() -> (typeface, style, size: number)                          * +\***************************************************************************/ +static int wdlua5_getfont(lua_State *L) +{ +  char type_face[1024]; +  int style; +  double size; + +  wdCanvasGetFont(cdlua_checkcanvas(L, 1), type_face, &style, &size); +  lua_pushstring(L, type_face); +  lua_pushnumber(L, style); +  lua_pushnumber(L, size); +  return 3; +} + +/***************************************************************************\ +* cd.NativeFont(font: string)                                               * +\***************************************************************************/ +static int cdlua5_nativefont(lua_State *L) +{ +  lua_pushstring(L, cdCanvasNativeFont(cdlua_checkcanvas(L, 1), luaL_checkstring(L, 2))); +  return 1; +} + +/***************************************************************************\ +* cd.TextAlignment(alignment: number) -> (old_alignment: number)            * +\***************************************************************************/ +static int cdlua5_textalignment(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasTextAlignment(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2))); +  return 1; +} + +/***************************************************************************\ +* cd.TextOrientation(angle: number) -> (old_angle: number)                  * +\***************************************************************************/ +static int cdlua5_textorientation(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasTextOrientation(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2))); +  return 1; +} + +/***************************************************************************\ +* cd.FontDim() -> (max_width, max_height, ascent, descent: number)          * +\***************************************************************************/ +static int cdlua5_fontdim(lua_State *L) +{ +  int max_width; +  int height; +  int ascent; +  int descent; + +  cdCanvasGetFontDim(cdlua_checkcanvas(L, 1), &max_width, &height, &ascent, &descent); +  lua_pushnumber(L, max_width); +  lua_pushnumber(L, height); +  lua_pushnumber(L, ascent); +  lua_pushnumber(L, descent); +  return 4; +} + +/***************************************************************************\ +* cd.wFontDim() -> (max_width, max_height, ascent, descent: number)         * +\***************************************************************************/ +static int wdlua5_fontdim(lua_State *L) +{ +  double max_width; +  double height; +  double ascent; +  double descent; + +  wdCanvasGetFontDim(cdlua_checkcanvas(L, 1), &max_width, &height, &ascent, &descent); +  lua_pushnumber(L, max_width); +  lua_pushnumber(L, height); +  lua_pushnumber(L, ascent); +  lua_pushnumber(L, descent); +  return 4; +} + +/***************************************************************************\ +* cd.TextSize(text: string) -> (width, heigth: number)                      * +\***************************************************************************/ +static int cdlua5_textsize(lua_State *L) +{ +  int width; +  int height; +  cdCanvasGetTextSize(cdlua_checkcanvas(L, 1), luaL_checkstring(L, 2), &width, &height); +  lua_pushnumber(L, width); +  lua_pushnumber(L, height); +  return 2; +} + +/***************************************************************************\ +* cd.wTextSize(text: string) -> (width, heigth: number)                     * +\***************************************************************************/ +static int wdlua5_textsize(lua_State *L) +{ +  double width; +  double height; +  wdCanvasGetTextSize(cdlua_checkcanvas(L, 1), luaL_checkstring(L, 2), &width, &height); +  lua_pushnumber(L, width); +  lua_pushnumber(L, height); +  return 2; +} + +/****************************************************************************\ +* cd.TextBox(x, y: number, text: string) -> (xmin, xmax, ymin, ymax: number) * +\****************************************************************************/ +static int cdlua5_textbox(lua_State *L) +{ +  int xmin, xmax, ymin, ymax; +  int x = luaL_checkint(L, 2); +  int y = luaL_checkint(L, 3); +  const char* s = luaL_checkstring(L, 4); + +  cdCanvasGetTextBox(cdlua_checkcanvas(L, 1), x, y, s, &xmin, &xmax, &ymin, &ymax); +  lua_pushnumber(L, xmin); +  lua_pushnumber(L, xmax); +  lua_pushnumber(L, ymin); +  lua_pushnumber(L, ymax); +  return 4; +} + +/*****************************************************************************\ +* cd.wTextBox(x, y: number, text: string) -> (xmin, xmax, ymin, ymax: number) * +\*****************************************************************************/ +static int wdlua5_textbox(lua_State *L) +{ +  double xmin, xmax, ymin, ymax; +  double x = luaL_checknumber(L, 2); +  double y =  luaL_checknumber(L, 3); +  const char* s = luaL_checkstring(L, 4); + +  wdCanvasGetTextBox(cdlua_checkcanvas(L, 1), x, y, s, &xmin, &xmax, &ymin, &ymax); +  lua_pushnumber(L, xmin); +  lua_pushnumber(L, xmax); +  lua_pushnumber(L, ymin); +  lua_pushnumber(L, ymax); +  return 4; +} + +/***************************************************************************************************************\ +* cd.TextBounds(x, y: number, text: string) -> (rect0, rect1, rect2, rect3, rect4, rect5, rect6, rect7: number) * +\***************************************************************************************************************/ +static int cdlua5_textbounds(lua_State *L) +{ +  int rect[8]; +  int x = luaL_checkint(L, 2); +  int y = luaL_checkint(L, 3); +  const char* s = luaL_checkstring(L, 4); + +  cdCanvasGetTextBounds(cdlua_checkcanvas(L, 1), x, y, s, rect); +  lua_pushnumber(L, rect[0]); +  lua_pushnumber(L, rect[1]); +  lua_pushnumber(L, rect[2]); +  lua_pushnumber(L, rect[3]); +  lua_pushnumber(L, rect[4]); +  lua_pushnumber(L, rect[5]); +  lua_pushnumber(L, rect[6]); +  lua_pushnumber(L, rect[7]); +  return 4; +} + +/****************************************************************************************************************\ +* cd.wTextBounds(x, y: number, text: string) -> (rect0, rect1, rect2, rect3, rect4, rect5, rect6, rect7: number) * +\****************************************************************************************************************/ +static int wdlua5_textbounds(lua_State *L) +{ +  double rect[8]; +  double x = luaL_checknumber(L, 2); +  double y = luaL_checknumber(L, 3); +  const char* s = luaL_checkstring(L, 4); + +  wdCanvasGetTextBounds(cdlua_checkcanvas(L, 1), x, y, s, rect); +  lua_pushnumber(L, rect[0]); +  lua_pushnumber(L, rect[1]); +  lua_pushnumber(L, rect[2]); +  lua_pushnumber(L, rect[3]); +  lua_pushnumber(L, rect[4]); +  lua_pushnumber(L, rect[5]); +  lua_pushnumber(L, rect[6]); +  lua_pushnumber(L, rect[7]); +  return 4; +} + + + +/***************************************************************************\ +* Text                                                                      * +\***************************************************************************/ + +/***************************************************************************\ +* cd.VectorText(x, y: number, text: string)                                 * +\***************************************************************************/ +static int cdlua5_vectortext(lua_State *L) +{ +  const char* s = luaL_checkstring(L,4); +  cdCanvasVectorText(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2), luaL_checkint(L, 3), s); +  return 0; +} + +/***************************************************************************\ +* cd.wVectorText(x, y: number, text: string)                                * +\***************************************************************************/ +static int wdlua5_vectortext(lua_State *L) +{ +  const char* s = luaL_checkstring(L, 4); +  wdCanvasVectorText(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3),s); +  return 0; +} + +/***************************************************************************\ +* cd.MultiLineVectorText(x, y: number, text: string)                        * +\***************************************************************************/ +static int cdlua5_multilinevectortext(lua_State *L) +{ +  const char* s = luaL_checkstring(L, 4); +  cdCanvasMultiLineVectorText(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2), luaL_checkint(L, 3), s); +  return 0; +} + +/***************************************************************************\ +* cd.wMultiLineVectorText(x, y: number, text: string)                       * +\***************************************************************************/ +static int wdlua5_multilinevectortext(lua_State *L) +{ +  const char* s = luaL_checkstring(L, 4); +  wdCanvasMultiLineVectorText(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3), s); +  return 0; +} + +/***************************************************************************\ +* cd.VectorTextDirection(x1, y1, x2, y2: number)                            * +\***************************************************************************/ +static int cdlua5_vectortextdirection(lua_State *L) +{ +  int x1 = luaL_checkint(L,2); +  int y1 = luaL_checkint(L,3); +  int x2 = luaL_checkint(L,4); +  int y2 = luaL_checkint(L,5); +  cdCanvasVectorTextDirection(cdlua_checkcanvas(L, 1), x1, y1, x2, y2); +  return 0; +} + +/***************************************************************************\ +* cd.wVectorTextDirection(x1, y1, x2, y2: number)                           * +\***************************************************************************/ +static int wdlua5_vectortextdirection(lua_State *L) +{ +  double x1 = luaL_checknumber(L, 2); +  double y1 = luaL_checknumber(L, 3); +  double x2 = luaL_checknumber(L, 4); +  double y2 = luaL_checknumber(L, 5); +  wdCanvasVectorTextDirection(cdlua_checkcanvas(L, 1), x1, y1, x2, y2); +  return 0; +} + + +/***************************************************************************\ +* cd.VectorTextTransform(matrix: table) -> (old_matrix: table)              * +\***************************************************************************/ +static int cdlua5_vectortexttransform(lua_State *L) +{ +  double matrix[6], *old_matrix; +  int i; + +  if (!lua_istable(L, 2)) +    luaL_argerror(L, 2, "invalid matrix, must be a table"); + +  for (i=0; i < 6; i++) +  { +    lua_rawgeti(L, 2, i+1); + +    if (!lua_isnumber(L, -1)) +      luaL_argerror(L, 2, "invalid matrix value, must be a number"); + +    matrix[i] = lua_tonumber(L, -1); +    lua_pop(L, 1); +  } + +  old_matrix = cdCanvasVectorTextTransform(cdlua_checkcanvas(L, 1), matrix); +  lua_newtable(L); +  for (i=0; i < 6; i++) +  { +    lua_pushnumber(L, old_matrix[i]); +    lua_rawseti(L, 1, i+1); +  } +  return 1; +} + +/***************************************************************************\ +* cd.VectorTextSize(w, h: number, text: string)                             * +\***************************************************************************/ +static int cdlua5_vectortextsize(lua_State *L) +{ +  const char* s = luaL_checkstring(L, 4); +  cdCanvasVectorTextSize(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2), luaL_checkint(L, 3), s); +  return 0; +} + +/***************************************************************************\ +* cd.wVectorTextSize(w, h: number, text: string)                            * +\***************************************************************************/ +static int wdlua5_vectortextsize(lua_State *L) +{ +  const char* s = luaL_checkstring(L, 4); +  wdCanvasVectorTextSize(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3), s); +  return 0; +} + +/***************************************************************************\ +* cd.VectorTextSize(w, h: number, text: string)                             * +\***************************************************************************/ +static int cdlua5_vectorcharsize(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasVectorCharSize(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2))); +  return 1; +} + +/***************************************************************************\ +* cd.wVectorTextSize(w, h: number, text: string)                            * +\***************************************************************************/ +static int wdlua5_vectorcharsize(lua_State *L) +{ +  lua_pushnumber(L, wdCanvasVectorCharSize(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2))); +  return 1; +} + +/***************************************************************************\ +* cd.VectorFont(filename: string) -> (font_name: string)                    * +\***************************************************************************/ +static int cdlua5_vectorfont(lua_State *L) +{ +  lua_pushstring(L, cdCanvasVectorFont(cdlua_checkcanvas(L, 1), luaL_checkstring(L, 2))); +  return 1; +} + +/***************************************************************************\ +* cd.GetVectorTextSize(text: string) -> (w, h: number)                      * +\***************************************************************************/ +static int cdlua5_getvectortextsize(lua_State *L) +{ +  int width; +  int height; +  cdCanvasGetVectorTextSize(cdlua_checkcanvas(L, 1), luaL_checkstring(L, 2), &width, &height); +  lua_pushnumber(L, width); +  lua_pushnumber(L, height);    +  return 2; +} + +/***************************************************************************\ +* cd.wGetVectorTextSize(text: string) -> (w, h: number)                     * +\***************************************************************************/ +static int wdlua5_getvectortextsize(lua_State *L) +{ +  double width; +  double height; +  wdCanvasGetVectorTextSize(cdlua_checkcanvas(L, 1), luaL_checkstring(L, 2), &width, &height); +  lua_pushnumber(L, width); +  lua_pushnumber(L, height); +  return 2; +} + +/***************************************************************************\ +* cd.GetVectorTextBounds(s: string, px,py: number) -> (rect: table)         * +\***************************************************************************/ +static int cdlua5_vectortextbounds(lua_State *L) +{ +  const char* s = luaL_checkstring(L, 2); +  int x = luaL_checkint(L, 3); +  int y = luaL_checkint(L, 4); +  int rect[8], i; + +  cdCanvasGetVectorTextBounds(cdlua_checkcanvas(L, 1), s, x, y, rect); +  lua_newtable(L); +  for (i=0; i < 8; i++) +  { +    lua_pushnumber(L, rect[i]); +    lua_rawseti(L, -2, i+1); +  } +  return 1; +} + +/***************************************************************************\ +* cd.wGetVectorTextBounds(s: string, px,py: number) -> (rect: table)        * +\***************************************************************************/ +static int wdlua5_vectortextbounds(lua_State *L) +{ +  const char* s = luaL_checkstring(L, 2); +  double x = luaL_checknumber(L, 3); +  double y = luaL_checknumber(L, 4); +  double rect[8]; +  int i; +   +  wdCanvasGetVectorTextBounds(cdlua_checkcanvas(L, 1), s, x, y, rect); +  lua_newtable(L); +  for (i=0; i < 8; i++) +  { +    lua_pushnumber(L, rect[i]); +    lua_rawseti(L, -2, i+1); +  } +  return 1; +} + + + +/***************************************************************************\ +* Client Images.                                                            * +\***************************************************************************/ + +static int cdlua5_getimagergb(lua_State *L) +{ +  cdluaImageRGB* imagergb_p = cdlua_checkimagergb(L, 2); +  int x = luaL_checkint(L, 3); +  int y = luaL_checkint(L, 4); +  cdCanvasGetImageRGB(cdlua_checkcanvas(L, 1), imagergb_p->red, imagergb_p->green, imagergb_p->blue, +                      x, y, imagergb_p->width, imagergb_p->height); +  return 0; +} + +static int cdlua5_putimagerectrgb(lua_State *L) +{ +  cdluaImageRGB* imagergb_p = cdlua_checkimagergb(L, 2); +  int x = luaL_checkint(L, 3); +  int y = luaL_checkint(L, 4); +  int w = luaL_checkint(L, 5); +  int h = luaL_checkint(L, 6); +  int xmin = luaL_checkint(L, 7); +  int xmax = luaL_checkint(L, 8); +  int ymin = luaL_checkint(L, 9); +  int ymax = luaL_checkint(L, 10); + +  if (w < 0 || h < 0) +    luaL_argerror(L, 5, "target region dimensions should be positive integers"); +   +  cdCanvasPutImageRectRGB(cdlua_checkcanvas(L, 1), imagergb_p->width, imagergb_p->height, imagergb_p->red,  +    imagergb_p->green, imagergb_p->blue, x, y, w, h, xmin, xmax, ymin, ymax); +  return 0; +} + +static int wdlua5_putimagerectrgb(lua_State *L) +{ +  cdluaImageRGB* imagergb_p = cdlua_checkimagergb(L, 2); +  double x = luaL_checknumber(L, 3); +  double y = luaL_checknumber(L, 4); +  double w = luaL_checknumber(L, 5); +  double h = luaL_checknumber(L, 6); +  int xmin = luaL_checkint(L, 7); +  int xmax = luaL_checkint(L, 8); +  int ymin = luaL_checkint(L, 9); +  int ymax = luaL_checkint(L, 10); + +  if (w < 0 || h < 0) +    luaL_argerror(L, 5, "target region dimensions should be positive integers"); +   +  wdCanvasPutImageRectRGB(cdlua_checkcanvas(L, 1), imagergb_p->width, imagergb_p->height, imagergb_p->red,  +                          imagergb_p->green, imagergb_p->blue, x, y, w, h, xmin, xmax, ymin, ymax); +  return 0; +} + +static int cdlua5_putimagerectrgba(lua_State *L) +{ +  cdluaImageRGBA* imagergba_p = cdlua_checkimagergba(L, 2); +  int x = luaL_checkint(L, 3); +  int y = luaL_checkint(L, 4); +  int w = luaL_checkint(L, 5); +  int h = luaL_checkint(L, 6); +  int xmin = luaL_checkint(L, 7); +  int xmax = luaL_checkint(L, 8); +  int ymin = luaL_checkint(L, 9); +  int ymax = luaL_checkint(L, 10); + +  if (w < 0 || h < 0) +    luaL_argerror(L, 5, "target region dimensions should be positive integers"); + +  cdCanvasPutImageRectRGBA(cdlua_checkcanvas(L, 1), imagergba_p->width, imagergba_p->height, imagergba_p->red,  +                           imagergba_p->green, imagergba_p->blue, imagergba_p->alpha, x, y, w, h, xmin, xmax, ymin, ymax); +  return 0; +} + +static int wdlua5_putimagerectrgba(lua_State *L) +{ +  cdluaImageRGBA* imagergba_p = cdlua_checkimagergba(L, 2); +  double x = luaL_checknumber(L, 3); +  double y = luaL_checknumber(L, 4); +  double w = luaL_checknumber(L, 5); +  double h = luaL_checknumber(L, 6); +  int xmin = luaL_checkint(L, 7); +  int xmax = luaL_checkint(L, 8); +  int ymin = luaL_checkint(L, 9); +  int ymax = luaL_checkint(L, 10); + +  if (w < 0 || h < 0) +    luaL_argerror(L, 5, "target region dimensions should be positive integers"); + +  wdCanvasPutImageRectRGBA(cdlua_checkcanvas(L, 1), imagergba_p->width, imagergba_p->height, imagergba_p->red,  +                           imagergba_p->green, imagergba_p->blue, imagergba_p->alpha, x, y, w, h, xmin, xmax, ymin, ymax); +  return 0; +} + +static int cdlua5_putimagerectmap(lua_State *L) +{ +  cdluaImageMap* imagemap_p = cdlua_checkimagemap(L, 2); +  cdluaPalette *pal = cdlua_checkpalette(L, 3); +  int x = luaL_checkint(L, 4); +  int y = luaL_checkint(L, 5); +  int w = luaL_checkint(L, 6); +  int h = luaL_checkint(L, 7); +  int xmin = luaL_checkint(L, 8); +  int xmax = luaL_checkint(L, 9); +  int ymin = luaL_checkint(L, 10); +  int ymax = luaL_checkint(L, 11); + +  if (w < 0 || h < 0) +    luaL_argerror(L, 6, "target region dimensions should be positive integers"); +   +  cdCanvasPutImageRectMap(cdlua_checkcanvas(L, 1), imagemap_p->width, imagemap_p->height, imagemap_p->index,  +                          pal->color, x, y, w, h, xmin, xmax, ymin, ymax); +  return 0; +} + +static int wdlua5_putimagerectmap(lua_State *L) +{ +  cdluaImageMap* imagemap_p = cdlua_checkimagemap(L, 2); +  cdluaPalette *pal = cdlua_checkpalette(L, 3); +  double x = luaL_checknumber(L, 4); +  double y = luaL_checknumber(L, 5); +  double w = luaL_checknumber(L, 6); +  double h = luaL_checknumber(L, 7); +  int xmin = luaL_checkint(L, 8); +  int xmax = luaL_checkint(L, 9); +  int ymin = luaL_checkint(L, 10); +  int ymax = luaL_checkint(L, 11); + +  if (w < 0 || h < 0) +    luaL_argerror(L, 6, "target region dimensions should be positive integers"); +   +  wdCanvasPutImageRectMap(cdlua_checkcanvas(L, 1), imagemap_p->width, imagemap_p->height, imagemap_p->index,  +                          pal->color, x, y, w, h, xmin, xmax, ymin, ymax); +  return 0; +} + +static int cdlua5_putbitmap(lua_State *L) +{ +  cdBitmap *bitmap = cdlua_checkbitmap(L, 2); +  int x = luaL_checkint(L, 3); +  int y = luaL_checkint(L, 4); +  int w = luaL_checkint(L, 5); +  int h = luaL_checkint(L, 6); +   +  if (w < 0 || h < 0) +    luaL_argerror(L, 5, "target region dimensions should be positive integers"); + +  cdCanvasPutBitmap(cdlua_checkcanvas(L, 1), bitmap, x, y, w, h); +  return 0; +} + +static int wdlua5_putbitmap(lua_State *L) +{ +  cdBitmap *bitmap = cdlua_checkbitmap(L, 2); +  double x = luaL_checknumber(L, 3); +  double y = luaL_checknumber(L, 4); +  double w = luaL_checknumber(L, 5); +  double h = luaL_checknumber(L, 6); + +  if (w < 0 || h < 0) +    luaL_argerror(L, 5, "target region dimensions should be positive integers"); + +  wdCanvasPutBitmap(cdlua_checkcanvas(L, 1), bitmap, x, y, w, h); +  return 0; +} + +static int cdlua5_getbitmap(lua_State *L) +{ +  cdBitmap *bitmap = cdlua_checkbitmap(L, 2); +  int x = luaL_checkint(L, 3); +  int y = luaL_checkint(L, 4); +  cdCanvasGetBitmap(cdlua_checkcanvas(L, 1), bitmap, x, y); +  return 0; +} + +/***************************************************************************\ +* Server Images.                                                            * +\***************************************************************************/ + +static int cdlua5_createimage(lua_State *L) +{ +  cdImage *image; +  int width = luaL_checkint(L, 2); +  int height = luaL_checkint(L, 3); + +  if (width < 1 || height < 1) +    luaL_argerror(L, 2, "image dimensions should be positive integers"); + +  image = cdCanvasCreateImage(cdlua_checkcanvas(L, 1), width, height); +  if (image)  +    cdlua_pushimage(L, image); +  else +    lua_pushnil(L); + +  return 1; +} + +static int cdlua5_getimage(lua_State *L) +{ +  cdImage* image = cdlua_checkimage(L, 2); +  int x = luaL_checkint(L, 3); +  int y = luaL_checkint(L, 4); +  cdCanvasGetImage(cdlua_checkcanvas(L, 1), image, x, y); +  return 0; +} + +static int cdlua5_putimagerect(lua_State *L) +{ +  cdImage* image = cdlua_checkimage(L, 2); +  int x = luaL_checkint(L, 3); +  int y = luaL_checkint(L, 4); +  int xmin = luaL_checkint(L, 5); +  int xmax = luaL_checkint(L, 6); +  int ymin = luaL_checkint(L, 7); +  int ymax = luaL_checkint(L, 8); +  cdCanvasPutImageRect(cdlua_checkcanvas(L, 1), image, x, y, xmin, xmax, ymin, ymax); +  return 0; +} + +static int wdlua5_putimagerect(lua_State *L) +{ +  cdImage* image = cdlua_checkimage(L, 2); +  double x = luaL_checknumber(L, 3); +  double y = luaL_checknumber(L, 4); +  int xmin = luaL_checkint(L, 5); +  int xmax = luaL_checkint(L, 6); +  int ymin = luaL_checkint(L, 7); +  int ymax = luaL_checkint(L, 8); +  wdCanvasPutImageRect(cdlua_checkcanvas(L, 1), image, x, y, xmin, xmax, ymin, ymax); +  return 0; +} + +/***************************************************************************\ +* cd.ScrollArea(xmin, xmax, ymin, ymax, dx, dy: number)                     * +\***************************************************************************/ +static int cdlua5_scrollarea(lua_State *L) +{ +  int xmin = luaL_checkint(L, 2); +  int xmax = luaL_checkint(L, 3); +  int ymin = luaL_checkint(L, 4); +  int ymax = luaL_checkint(L, 5); +  int dx = luaL_checkint(L, 6); +  int dy = luaL_checkint(L, 7); +  cdCanvasScrollArea(cdlua_checkcanvas(L, 1), xmin, xmax, ymin, ymax, dx, dy); +  return 0; +} + + + +/***************************************************************************\ +* Other                                                                     * +\***************************************************************************/ + +/********************************************************************************\ +* cd.Play(ctx, xmin, xmax, ymin, ymax: number, data: string) -> (status: number) * +\********************************************************************************/ + +static int cdlua5_play(lua_State *L) +{ +  cdluaContext* cdlua_ctx = cdlua_getcontext(L, 2); +  int xmin = luaL_checkint(L,3); +  int xmax = luaL_checkint(L,4); +  int ymin = luaL_checkint(L,5); +  int ymax = luaL_checkint(L,6); +  const char *data_s = luaL_checkstring(L,7); + +  cdlua_setplaystate(L); +  cdCanvasPlay(cdlua_checkcanvas(L, 1), cdlua_ctx->ctx(), xmin, xmax, ymin, ymax, (void*)data_s); +  cdlua_setplaystate(NULL); +  return 0; +} + +/***************************************************************************\ +* cd.GetColorPlanes() -> (bpp: number)                                      * +\***************************************************************************/ +static int cdlua5_getcolorplanes(lua_State *L) +{ +  lua_pushnumber(L, cdCanvasGetColorPlanes(cdlua_checkcanvas(L, 1))); +  return 1; +} + +static int cdlua5_palette(lua_State *L) +{ +  cdluaPalette *pal = cdlua_checkpalette(L, 2); +  int mode_i = luaL_checkint(L, 3); +  cdCanvasPalette(cdlua_checkcanvas(L, 1), pal->count, pal->color, mode_i); +  return 0; +} + +/***************************************************************************\ +* cd.ImageRGB                                                               * +\***************************************************************************/ +static int cdlua5_imagergb(lua_State *L) +{ +  int w, h, type = CD_RGB; + +  cdCanvas* canvas = cdlua_checkcanvas(L, 1); + +  if (cdCanvasGetContext(canvas) != CD_IMAGERGB) +    luaL_argerror(L, 1, "invalid canvas, must be CD_IMAGERGB"); + +  if (cdAlphaImage(canvas)) +    type = CD_RGBA; + +  cdCanvasGetSize(canvas, &w, &h, NULL, NULL); + +  /* mark the image NOT to be freed */ +  if (type == CD_RGBA) +    cdlua_pushimagergba_ex(L, cdRedImage(canvas), cdGreenImage(canvas), cdBlueImage(canvas), cdAlphaImage(canvas), w, h); +  else +    cdlua_pushimagergb_ex(L, cdRedImage(canvas), cdGreenImage(canvas), cdBlueImage(canvas), w, h); + +  return 1; +} + +/***************************************************************************\ +* cd.ImageRGBBitmap                                                        * +\***************************************************************************/ +static int cdlua5_imagergbbitmap(lua_State *L) +{ +  int w, h, type = CD_RGB; + +  cdCanvas* canvas = cdlua_checkcanvas(L, 1); + +  if (cdCanvasGetContext(canvas) != CD_IMAGERGB) +    luaL_argerror(L, 1, "invalid canvas, must be CD_IMAGERGB"); + +  if (cdAlphaImage(canvas)) +    type = CD_RGBA; + +  cdCanvasGetSize(canvas, &w, &h, NULL, NULL); + +  cdlua_pushbitmap(L, cdInitBitmap(w, h, type,  +                                   cdRedImage(canvas), +                                   cdGreenImage(canvas), +                                   cdBlueImage(canvas), +                                   cdAlphaImage(canvas))); + +  return 1; +} + +/***************************************************************************\ +* Hardcopy                                                                  * +\***************************************************************************/ +static lua_State* wdlua5_hardcopy_luaState = NULL; + +static void wdlua5_hardcopy_func(cdCanvas* canvas)  +{ +  lua_State* L = wdlua5_hardcopy_luaState; +  lua_pushvalue(L, 4);   /* push the function in the stack */ +  cdlua_pushcanvas(L, canvas); +  if(lua_pcall(L, 1, 0, 0) != 0) +    luaL_error(L, "error running function: %s", lua_tostring(L, -1)); +} + +static int wdlua5_hardcopy(lua_State *L)  +{ +  cdCanvas* canvas = cdlua_checkcanvas(L, 1); +  cdluaContext* cdlua_ctx = cdlua_getcontext(L, 2); +  void *data_p = cdlua_ctx->checkdata(L,3); +  luaL_argcheck(L, !lua_isfunction(L, 4), 4, "invalid draw function"); + +  wdlua5_hardcopy_luaState = L; +  wdCanvasHardcopy(canvas, cdlua_ctx->ctx(), data_p, wdlua5_hardcopy_func); +  wdlua5_hardcopy_luaState = NULL; + +  return 0; +} + + +/***************************************************************************\ +* Polygon functions                                                         * +\***************************************************************************/ + +/***************************************************************************\ +* cd.Begin(mode: number)                                                    * +\***************************************************************************/ +static int cdlua5_begin(lua_State *L) +{  +  cdCanvasBegin(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2)); +  return 0; +} + +static int cdlua5_vertex(lua_State *L) +{ +  cdCanvasVertex(cdlua_checkcanvas(L, 1), luaL_checkint(L, 2), luaL_checkint(L, 3)); +  return 0; +} + +static int wdlua5_vertex(lua_State *L) +{ +  wdCanvasVertex(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3)); +  return 0; +} + +static int cdlua5_fvertex(lua_State *L) +{ +  cdfCanvasVertex(cdlua_checkcanvas(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3)); +  return 0; +} + +static int cdlua5_end(lua_State *L) +{ +  cdCanvasEnd(cdlua_checkcanvas(L, 1)); +  return 0; +} + + +/********************************************************************************\ +* Lua Exported functions                                                       * +\********************************************************************************/ + +static const struct luaL_reg cdlib_canvas_meta[] = { + +  /* Initialization */ +  {"GetContext"    , cdlua5_getcontext}, +  {"Kill"          , cdlua5_killcanvas}, +  {"Activate"      , cdlua5_activate}, +  {"Deactivate"    , cdlua5_deactivate}, +  {"Simulate"      , cdlua5_simulate}, + +  /* Control */ +  {"Clear"         , cdlua5_clear}, +  {"Flush"         , cdlua5_flush}, +  {"SaveState"     , cdlua5_savestate}, +  {"RestoreState"  , cdlua5_restorestate}, +  {"SetAttribute"  , cdlua5_setattribute}, +  {"GetAttribute"  , cdlua5_getattribute}, + +  /* Coordinate System */ +  {"GetSize"       , cdlua5_getcanvassize}, +  {"UpdateYAxis"   , cdlua5_updateyaxis}, +  {"InvertYAxis"   , cdlua5_invertyaxis}, +  {"MM2Pixel"      , cdlua5_mm2pixel}, +  {"Pixel2MM"      , cdlua5_pixel2mm}, +  {"Origin"        , cdlua5_origin}, +  {"GetOrigin"     , cdlua5_getorigin}, +  {"fMM2Pixel"      , cdlua5_fmm2pixel}, +  {"fPixel2MM"      , cdlua5_fpixel2mm}, +  {"fOrigin"        , cdlua5_forigin}, +  {"fGetOrigin"     , cdlua5_fgetorigin}, +  {"Transform"     , cdlua5_transform}, +  {"GetTransform"     , cdlua5_gettransform}, +  {"TransformMultiply"     , cdlua5_transformmultiply}, +  {"TransformRotate"     , cdlua5_transformrotate}, +  {"TransformScale"     , cdlua5_transformscale}, +  {"TransformTranslate"     , cdlua5_transformtranslate}, +  {"TransformPoint"     , cdlua5_transformpoint}, +  {"fTransformPoint"     , cdlua5_ftransformpoint}, + +  /* World Coordinates */ +  {"wWindow"        , wdlua5_window}, +  {"wGetWindow"     , wdlua5_getwindow}, +  {"wViewport"      , wdlua5_viewport}, +  {"wGetViewport"   , wdlua5_getviewport},   +  {"wWorld2Canvas"  , wdlua5_world2canvas}, +  {"wCanvas2World"  , wdlua5_canvas2world}, + +  {"wHardcopy"      , wdlua5_hardcopy}, + +  /* General Attributes */ +  {"Foreground"  , cdlua5_foreground}, +  {"Background"  , cdlua5_background},   +  {"SetForeground"  , cdlua5_setforeground}, +  {"SetBackground"  , cdlua5_setbackground},   +  {"WriteMode"   , cdlua5_writemode}, + +  /* Clipping */ +  {"Clip"          , cdlua5_clip}, +  {"ClipArea"      , cdlua5_cliparea}, +  {"GetClipArea"   , cdlua5_getcliparea}, +  {"wClipArea"     , wdlua5_cliparea}, +  {"wGetClipArea"  , wdlua5_getcliparea},   +  {"fClipArea"      , cdlua5_fcliparea}, +  {"fGetClipArea"   , cdlua5_fgetcliparea}, + +  /* Regions */ +  {"RegionCombineMode" , cdlua5_regioncombinemode}, +  {"IsPointInRegion"     , cdlua5_pointinregion}, +  {"wIsPointInRegion"    , wdlua5_pointinregion}, +  {"OffsetRegion"      , cdlua5_offsetregion}, +  {"wOffsetRegion"     , wdlua5_offsetregion}, +  {"GetRegionBox"         , cdlua5_regionbox}, +  {"wGetRegionBox"        , wdlua5_regionbox}, + +  /* Marks */ +  {"Pixel"     , cdlua5_pixel}, +  {"wPixel"    , wdlua5_pixel}, +  {"Mark"      , cdlua5_mark}, +  {"wMark"     , wdlua5_mark}, +  {"MarkType"  , cdlua5_marktype}, +  {"MarkSize"  , cdlua5_marksize}, +  {"wMarkSize" , wdlua5_marksize}, + +  /* Line */ +  {"Line"            , cdlua5_line}, +  {"wLine"           , wdlua5_line}, +  {"fLine"           , cdlua5_fline}, +  {"Rect"            , cdlua5_rect}, +  {"wRect"           , wdlua5_rect}, +  {"fRect"            , cdlua5_frect}, +  {"Arc"             , cdlua5_arc}, +  {"wArc"            , wdlua5_arc}, +  {"fArc"             , cdlua5_farc}, +  {"LineStyle"       , cdlua5_linestyle}, +  {"LineStyleDashes" , cdlua5_linestyledashes}, +  {"LineWidth"       , cdlua5_linewidth}, +  {"wLineWidth"      , wdlua5_linewidth}, +  {"LineJoin"        , cdlua5_linejoin}, +  {"LineCap"         , cdlua5_linecap}, + +  /* Filled Areas */ +  {"Box"           , cdlua5_box}, +  {"wBox"          , wdlua5_box}, +  {"fBox"           , cdlua5_fbox}, +  {"Sector"        , cdlua5_sector}, +  {"wSector"       , wdlua5_sector}, +  {"fSector"        , cdlua5_fsector}, +  {"Chord"         , cdlua5_chord},   +  {"wChord"        , wdlua5_chord}, +  {"fChord"         , cdlua5_fchord},   +  {"BackOpacity"   , cdlua5_backopacity}, +  {"FillMode"      , cdlua5_fillmode},   +  {"InteriorStyle" , cdlua5_interiorstyle}, +  {"Hatch"         , cdlua5_hatch}, + +  /* Stipple */ +  {"Stipple"      , cdlua5_stipple}, +  {"wStipple"     , wdlua5_stipple}, +  {"GetStipple"   , cdlua5_getstipple}, +   +  /* Pattern */ +  {"Pattern"      , cdlua5_pattern}, +  {"wPattern"     , wdlua5_pattern}, +  {"GetPattern"   , cdlua5_getpattern}, + +  /* Text */ +  {"Text"            , cdlua5_text}, +  {"wText"           , wdlua5_text}, +  {"fText"            , cdlua5_ftext}, +  {"Font"            , cdlua5_font}, +  {"wFont"           , wdlua5_font}, +  {"GetFont"         , cdlua5_getfont}, +  {"wGetFont"        , wdlua5_getfont}, +  {"NativeFont"      , cdlua5_nativefont}, +  {"TextAlignment"   , cdlua5_textalignment}, +  {"TextOrientation" , cdlua5_textorientation}, +  {"GetFontDim"         , cdlua5_fontdim}, +  {"wGetFontDim"        , wdlua5_fontdim}, +  {"GetTextSize"        , cdlua5_textsize}, +  {"wGetTextSize"       , wdlua5_textsize}, +  {"GetTextBox"         , cdlua5_textbox}, +  {"wGetTextBox"        , wdlua5_textbox}, +  {"GetTextBounds"      , cdlua5_textbounds}, +  {"wGetTextBounds"     , wdlua5_textbounds}, + +  /* Vector Text */ +  {"VectorText"           , cdlua5_vectortext}, +  {"wVectorText"          , wdlua5_vectortext}, +  {"MultiLineVectorText"  , cdlua5_multilinevectortext}, +  {"wMultiLineVectorText" , wdlua5_multilinevectortext}, +  {"VectorTextDirection"  , cdlua5_vectortextdirection}, +  {"wVectorTextDirection" , wdlua5_vectortextdirection}, +  {"VectorTextTransform"  , cdlua5_vectortexttransform}, +  {"VectorTextSize"       , cdlua5_vectortextsize}, +  {"wVectorTextSize"      , wdlua5_vectortextsize}, +  {"VectorCharSize"       , cdlua5_vectorcharsize}, +  {"wVectorCharSize"      , wdlua5_vectorcharsize}, +  {"VectorFont"           , cdlua5_vectorfont}, +  {"GetVectorTextSize"    , cdlua5_getvectortextsize}, +  {"wGetVectorTextSize"   , wdlua5_getvectortextsize}, +  {"VectorTextBounds"     , cdlua5_vectortextbounds}, +  {"wVectorTextBounds"    , wdlua5_vectortextbounds},   +   +  /* Client Images */ +  {"GetImageRGB"      , cdlua5_getimagergb}, +  {"PutImageRectRGB"  , cdlua5_putimagerectrgb}, +  {"wPutImageRectRGB" , wdlua5_putimagerectrgb}, +  {"PutImageRectRGBA" , cdlua5_putimagerectrgba}, +  {"wPutImageRectRGBA", wdlua5_putimagerectrgba}, +  {"PutImageRectMap"  , cdlua5_putimagerectmap}, +  {"wPutImageRectMap" , wdlua5_putimagerectmap}, +  {"GetBitmap"        , cdlua5_getbitmap}, +  {"PutBitmap"        , cdlua5_putbitmap}, +  {"wPutBitmap"       , wdlua5_putbitmap}, +   +  /* Server Images */ +  {"CreateImage"      , cdlua5_createimage}, +  {"GetImage"         , cdlua5_getimage}, +  {"PutImageRect"     , cdlua5_putimagerect}, +  {"wPutImageRect"    , wdlua5_putimagerect}, +  {"ScrollArea"       , cdlua5_scrollarea}, + +  /* Other */ +  {"Play"             , cdlua5_play}, + +  /* Color Coding */ +  {"GetColorPlanes" , cdlua5_getcolorplanes}, + +  /* Palette */ +  {"Palette"      , cdlua5_palette}, + +  /* Polygon */ +  {"Begin"         , cdlua5_begin}, +  {"Vertex"        , cdlua5_vertex}, +  {"wVertex"       , wdlua5_vertex}, +  {"fVertex"        , cdlua5_fvertex}, +  {"End"           , cdlua5_end}, + +  {"__eq", cdluaCanvas_eq}, +  {"__tostring", cdluaCanvas_tostring}, + +  {NULL, NULL}, +}; + +static const struct luaL_reg cdlib_canvas[] = { +  /* Initialization */ +  {"CreateCanvas"  , cdlua5_createcanvas}, +  {"KillCanvas"    , cdlua5_killcanvas}, +  {"GetContext"    , cdlua5_getcontext},    /* compatibility name */ +  {"ImageRGB"         , cdlua5_imagergb}, +  {"ImageRGBBitmap"   , cdlua5_imagergbbitmap}, +  {NULL, NULL}, +}; + +void cdlua_open_canvas (lua_State *L) +{                                   +  /* "cd" table is at the top of the stack */ + +  /* Object Oriented Access */ +  luaL_newmetatable(L, "cdCanvas");    /* create new metatable for cdCanvas handles */ +  lua_pushliteral(L, "__index"); +  lua_pushvalue(L, -2);  /* push metatable */ +  lua_rawset(L, -3);     /* metatable.__index = metatable */ +  luaL_register(L, NULL, cdlib_canvas_meta);  /* register methods */ +  lua_pop(L, 1); /* removes the metatable from the top of the stack */ + +  luaL_register(L, NULL, cdlib_canvas); +} | 
