From 32485e2860c2ea31fcef5b575f446c7a3036a550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophile=20Diot?= Date: Fri, 30 Jun 2023 15:38:03 -0400 Subject: [PATCH] Squashed 'src/deps/src/lua-gd/' content from commit 2ce8e478a git-subtree-dir: src/deps/src/lua-gd git-subtree-split: 2ce8e478a8591afd71e607506bc8c64b161bbd30 --- .gitignore | 8 + COPYING | 23 + Makefile | 124 ++ README | 60 + README.win32 | 43 + debian/changelog | 19 + debian/control | 14 + debian/copyright | 23 + debian/rules | 83 ++ demos/Vera.ttf | Bin 0 -> 65932 bytes demos/brush.lua | 20 + demos/bugs.jpg | Bin 0 -> 12049 bytes demos/circle.lua | 14 + demos/clock.lua | 68 + demos/colortransparent.lua | 16 + demos/counter.lua | 30 + demos/ellipse.lua | 12 + demos/fontconfig.lua | 23 + demos/fractal.lua | 31 + demos/gd-open-any.lua | 52 + demos/gifanim.lua | 21 + demos/gifanim2.lua | 24 + demos/gifanim3.lua | 29 + demos/lua-gd.png | Bin 0 -> 13240 bytes demos/lualogo.lua | 60 + demos/paper.png | Bin 0 -> 4891 bytes demos/poly.lua | 16 + demos/setstyle.lua | 36 + demos/stdfont.lua | 22 + demos/steg.lua | 361 +++++ demos/test.lua | 35 + demos/test2.lua | 19 + demos/ttftext.lua | 30 + demos/ttftextex.lua | 49 + demos/utf-8.lua | 35 + doc/cat.png | Bin 0 -> 102810 bytes doc/catdiff.png | Bin 0 -> 68179 bytes doc/catmsg.png | Bin 0 -> 102940 bytes doc/clock-example.png | Bin 0 -> 982 bytes doc/fontconfig-example.png | Bin 0 -> 13816 bytes doc/gifanim.gif | Bin 0 -> 7005 bytes doc/index.html | 2796 ++++++++++++++++++++++++++++++++++++ doc/lua-gd.png | Bin 0 -> 13240 bytes doc/sierpinski.png | Bin 0 -> 1261 bytes doc/stdfonts.png | Bin 0 -> 616 bytes lua-gd.ps | 210 +++ lua-gd.spec | 60 + luagd-2.0.33r3-1.rockspec | 43 + luagd.c | 2361 ++++++++++++++++++++++++++++++ test_features.lua | 24 + 50 files changed, 6894 insertions(+) create mode 100644 .gitignore create mode 100644 COPYING create mode 100644 Makefile create mode 100644 README create mode 100644 README.win32 create mode 100644 debian/changelog create mode 100644 debian/control create mode 100644 debian/copyright create mode 100755 debian/rules create mode 100644 demos/Vera.ttf create mode 100755 demos/brush.lua create mode 100644 demos/bugs.jpg create mode 100755 demos/circle.lua create mode 100755 demos/clock.lua create mode 100755 demos/colortransparent.lua create mode 100755 demos/counter.lua create mode 100755 demos/ellipse.lua create mode 100755 demos/fontconfig.lua create mode 100755 demos/fractal.lua create mode 100644 demos/gd-open-any.lua create mode 100755 demos/gifanim.lua create mode 100755 demos/gifanim2.lua create mode 100755 demos/gifanim3.lua create mode 100644 demos/lua-gd.png create mode 100755 demos/lualogo.lua create mode 100644 demos/paper.png create mode 100755 demos/poly.lua create mode 100755 demos/setstyle.lua create mode 100755 demos/stdfont.lua create mode 100755 demos/steg.lua create mode 100755 demos/test.lua create mode 100755 demos/test2.lua create mode 100755 demos/ttftext.lua create mode 100755 demos/ttftextex.lua create mode 100755 demos/utf-8.lua create mode 100644 doc/cat.png create mode 100644 doc/catdiff.png create mode 100644 doc/catmsg.png create mode 100644 doc/clock-example.png create mode 100644 doc/fontconfig-example.png create mode 100644 doc/gifanim.gif create mode 100644 doc/index.html create mode 100644 doc/lua-gd.png create mode 100644 doc/sierpinski.png create mode 100644 doc/stdfonts.png create mode 100644 lua-gd.ps create mode 100644 lua-gd.spec create mode 100644 luagd-2.0.33r3-1.rockspec create mode 100644 luagd.c create mode 100644 test_features.lua diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..bde358438 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +*.so +*.lo +*.tar.gz + +demos/out.png +demos/out.gif +demos/counter.txt + diff --git a/COPYING b/COPYING new file mode 100644 index 000000000..11befb5bc --- /dev/null +++ b/COPYING @@ -0,0 +1,23 @@ +Lua-GD (c) 2004-2006 Alexandre Erwin Ittner + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHOR OR COPYRIGHT HOLDER BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +If you use this package in a product, an acknowledgment in the product +documentation would be greatly appreciated (but it is not required). diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..21f1d6fd5 --- /dev/null +++ b/Makefile @@ -0,0 +1,124 @@ +# luagd -- gd bindings for the Lua Programming Language. +# (c) 2004-11 Alexandre Erwin Ittner +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHOR OR COPYRIGHT HOLDER BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# If you use this package in a product, an acknowledgment in the product +# documentation would be greatly appreciated (but it is not required). +# + + +# Lua-GD version. This one must be set. +VERSION=2.0.33r3 + +# Command used to run Lua code +LUABIN=lua5.1 + +# Optimization for the brave of heart ;) +OMITFP=-fomit-frame-pointer + + +# --------------------------------------------------------------------------- +# Automatic configuration using pkgconfig. These lines should work on most +# Linux/Unix systems. If your system does not have these programs you must +# comment out these lines and uncomment and change the next ones. + +# Name of .pc file. "lua5.1" on Debian/Ubuntu +LUAPKG=lua5.1 +OUTFILE=gd.so + +CFLAGS=-O3 -Wall -fPIC $(OMITFP) +CFLAGS+=`pkg-config $(LUAPKG) --cflags` +CFLAGS+=-DVERSION=\"$(VERSION)\" + +GDFEATURES=-DGD_XPM -DGD_JPEG -DGD_FONTCONFIG -DGD_FREETYPE -DGD_PNG -DGD_GIF +LFLAGS=-shared `pkg-config $(LUAPKG) --libs` -lgd + +INSTALL_PATH := `pkg-config $(LUAPKG) --variable=INSTALL_CMOD` + + +# --------------------------------------------------------------------------- +# Manual configuration for systems without pkgconfig. +# WARNING: These instructions will only work on older versions of GD, since +# gdlib-config has been removed in favor of pkg-config. + +# Path to the utility 'gdlib-config'. This may be changed to compile the +# module with development versions of libgd. +#GDLIBCONFIG=gdlib-config + +#OUTFILE=gd.so +#CFLAGS=-O3 -Wall -fPIC $(OMITFP) +#CFLAGS+=`$(GDLIBCONFIG) --cflags` -I/usr/include/lua5.1 +#CFLAGS+=-DVERSION=\"$(VERSION)\" +#GDFEATURES=`$(GDLIBCONFIG) --features |sed -e "s/GD_/-DGD_/g"` +#LFLAGS=-shared `$(GDLIBCONFIG) --ldflags` `$(GDLIBCONFIG) --libs` -lgd +#INSTALL_PATH=/usr/lib/lua/ + + +# --------------------------------------------------------------------------- +# Manual configuration for Windows and systems without sed, pkgconfig, etc. +# Uncomment, change and good luck :) + +#OUTFILE=gd.dll +#CFLAGS=-O3 -Wall -fPIC $(OMITFP) +#CFLAGS+=-IC:/lua5.1/ +#CFLAGS+=-DVERSION=\"$(VERSION)\" +#GDFEATURES=-DGD_XPM -DGD_JPEG -DGD_FONTCONFIG -DGD_FREETYPE -DGD_PNG -DGD_GIF +#LFLAGS=-shared -lgd2 -lm $(OMITFP) +#INSTALL_PATH="C:/Program Files/lua/" +# --------------------------------------------------------------------------- + + +all: test + +$(OUTFILE): gd.lo + $(CC) -o $(OUTFILE) gd.lo $(LFLAGS) + +test: $(OUTFILE) + $(LUABIN) test_features.lua + +gd.lo: luagd.c + $(CC) -o gd.lo -c $(GDFEATURES) $(CFLAGS) luagd.c + +install: $(OUTFILE) + install -D -s $(OUTFILE) $(DESTDIR)/$(INSTALL_PATH)/$(OUTFILE) + + +# Rules for making a distribution tarball + +TDIR=lua-gd-$(VERSION) +DFILES=COPYING README luagd.c lua-gd.spec Makefile test_features.lua +dist: $(DISTFILES) + rm -f $(TDIR).tar.gz + mkdir $(TDIR) + mkdir -p $(TDIR)/doc $(TDIR)/demos $(TDIR)/debian + cp $(DFILES) $(TDIR) + cp demos/* $(TDIR)/demos/ + cp doc/* $(TDIR)/doc/ + cp debian/* $(TDIR)/debian/ + tar czf $(TDIR).tar.gz $(TDIR) + rm -rf $(TDIR) + +clean: + rm -f $(OUTFILE) gd.lo + rm -rf $(TDIR) $(TDIR).tar.gz + rm -f demos/out.png demos/out.gif demos/counter.txt + +.PHONY: all test install clean dist diff --git a/README b/README new file mode 100644 index 000000000..b91be781f --- /dev/null +++ b/README @@ -0,0 +1,60 @@ +Lua-GD, the gd bindings for the Lua Programming Language +(c) 2004-13 Alexandre Erwin Ittner + + ++ Introduction + +"gd" is a C graphics library created by Thomas Boutell that allows your +code to quickly draw complete images with lines, polygons, arcs, text, +multiple colors, cut and paste from other images, flood fills, read in +or write out images in the PNG, JPEG or GIF format. This is particularly +useful in World Wide Web applications, where PNG and JPEG are two of the +formats accepted for inline images by most browsers. gd does not provide +for every possible desirable graphics operation. It is not necessary or +desirable for gd to become a kitchen-sink graphics package, but it does +include most frequently requested features, including both truecolor +and palette images, resampling (smooth resizing of truecolor images) +and so forth. You can get more information about gd from it's homepage. + +Lua-GD is a "binding": a library that exports gd functions to the Lua +Programming Language, allowing you to use gd from Lua. The API was +NOT literally exported, but changed in a way that make it familiar to +Lua users. + +Lua-GD is a programming library, not a paint program. If you are looking +for that or are not familiar to the Lua Programming Language, you are +in the wrong place. + + ++ Documentation + +See doc/index.html for installation instructions and API documentation. + + ++ License + +Lua-GD is copyrighted free software, distributed under the MIT license +(the same used by Lua 5.1) and it can be used at no cost for both academic +and commercial purpouses. Or, more precisely: + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHOR OR COPYRIGHT HOLDER BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +If you use this package in a product, an acknowledgment in the product +documentation would be greatly appreciated (but it is not required). diff --git a/README.win32 b/README.win32 new file mode 100644 index 000000000..7250fb361 --- /dev/null +++ b/README.win32 @@ -0,0 +1,43 @@ +Lua-GD, the gd bindings for the Lua Programming Language +(c) 2004-11 Alexandre Erwin Ittner + +These are the Windows binaries for Lua-GD for Lua 5.1, compiled with +mingw32 3.4.4. These binaries also work with LuaJit 1.1.0. GD and its +dependencies were included in the distribution package for convenience. + +Please refer to 'README' For non-win32 specific information. + + ++ Licensing + +Each library has its own license. Please carefully read the following files: + + gd-license.txt + libfreetype-license.txt + libjpeg-license.txt + libpng-license.txt + zlib-license.txt + + ++ Instalation + +There is no automatic installation procedure for Windows. You must copy the +following DLLs to somewhere in your system path: + + freetype6.dll + jpeg62.dll + libgd2.dll + libiconv2.dll + libpng13.dll + xpm4.dll + zlib1.dll + +and, finally, copy the file "gd.dll" to your Lua binary package directory. + + ++ URLs + +Lua-GD: http://lua-gd.luaforge.net/ +Lua binaries: http://luabinaries.luaforge.net/ +GD binaries: http://gnuwin32.sourceforge.net/packages/gd.htm + diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 000000000..ddbdf815f --- /dev/null +++ b/debian/changelog @@ -0,0 +1,19 @@ +lua-gd (2.0.33r3-1) unstable; urgency=low + + * Update version. + + -- Alexandre Erwin Ittner Tue, 03 Oct 2013 01:00:00 -0300 + +lua-gd (2.0.33r2-2) unstable; urgency=low + + * Updated to Debian compatibility level 4. + + -- Alexandre Erwin Ittner Sun, 11 Feb 2007 15:20:09 -0200 + + +lua-gd (2.0.33r2-1) unstable; urgency=low + + * Initial release Closes: #nnnn (nnnn is the bug number of your ITP) + + -- Alexandre Erwin Ittner Wed, 3 May 2006 00:46:09 -0300 + diff --git a/debian/control b/debian/control new file mode 100644 index 000000000..5d86ea47f --- /dev/null +++ b/debian/control @@ -0,0 +1,14 @@ +Source: lua-gd +Priority: optional +Maintainer: Alexandre Erwin Ittner +Build-Depends: debhelper (>= 4.0.0), liblua5.1-dev +Standards-Version: 3.6.1 +Section: interpreters + +Package: lua-gd +Architecture: any +Depends: ${shlibs:Depends} +Recommends: lua5.1 +Description: GD bindings for the Lua Programming Language + Lua-GD is a library that allows you to use the gd graphic library from + programs written in the Lua programming language. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 000000000..11befb5bc --- /dev/null +++ b/debian/copyright @@ -0,0 +1,23 @@ +Lua-GD (c) 2004-2006 Alexandre Erwin Ittner + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHOR OR COPYRIGHT HOLDER BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +If you use this package in a product, an acknowledgment in the product +documentation would be greatly appreciated (but it is not required). diff --git a/debian/rules b/debian/rules new file mode 100755 index 000000000..ddf911a6a --- /dev/null +++ b/debian/rules @@ -0,0 +1,83 @@ +#!/usr/bin/make -f +# -*- makefile -*- + +## This is my first Debian package. Please, be patient ;) + + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# This is the debhelper compatability version to use. +export DH_COMPAT=4 + +LUAPKG=lua5.1 +INSTALL_PATH=`pkg-config $(LUAPKG) --variable=INSTALL_CMOD` + +CFLAGS = -Wall -g + +build: build-stamp +build-stamp: + dh_testdir + +# Well, this does it all. + $(MAKE) + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f gd.so + rm -f build-stamp configure-stamp + +# Toplevel clean does it all + -$(MAKE) clean + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + mkdir -p debian/lua-gd/usr/share/doc/lua-gd + mkdir -p debian/lua-gd/usr/share/doc/lua-gd/demos/ + mkdir -p debian/lua-gd/$(INSTALL_PATH) + + cp gd.so debian/lua-gd/$(INSTALL_PATH) + cp README COPYING doc/* debian/lua-gd/usr/share/doc/lua-gd/ + cp demos/* debian/lua-gd/usr/share/doc/lua-gd/demos/ + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir -a + dh_testroot -a +# dh_installdebconf -a + dh_installdocs -a +# dh_installexamples -a +# dh_installmenu -a +# dh_installlogrotate -a +# dh_installemacsen -a +# dh_installpam -a +# dh_installmime -a +# dh_installinit -a +# dh_installcron -a +# dh_installman -a +# dh_installinfo -a +# dh_undocumented -a + dh_installchangelogs -a + dh_strip -a + dh_link -a + dh_compress -a + dh_fixperms -a + dh_makeshlibs -a -V + dh_installdeb -a +# dh_perl -a + dh_shlibdeps -a + dh_gencontrol -a + dh_md5sums -a + dh_builddeb -a + +binary: binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/demos/Vera.ttf b/demos/Vera.ttf new file mode 100644 index 0000000000000000000000000000000000000000..58cd6b5e61eff273e920942e28041f8ddcf1e1b5 GIT binary patch literal 65932 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

B-* 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 rwRHEk3HV%fAP%O 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 +-- +-- Drawns the Lua Logo. This script requires fontconfig and the "Helvetica" +-- font installed in your system. +-- +-- + + +local gd = require("gd") + +gd.useFontConfig(true) + +function makelogo(size) + local nsize = 3 * size + local im = gd.createTrueColor(nsize, nsize) + local white = im:colorAllocate(255, 255, 255) + local blue = im:colorAllocate(0, 0, 128) + local gray = im:colorAllocate(170, 170, 170) + + local ediam = nsize * 0.68 -- Earth diameter + local mdiam = ediam * (1 - math.sqrt(2) / 2) -- Moon diameter + local odiam = ediam * 1.3 -- Orbit diameter + local emdist = odiam/2 * 1.05 -- Earth - Moon distance + local esdist = odiam/2 * 0.4 -- Earth - Moon shadow distance + local mang = 45 -- Moon angle (degrees) + local mangr = math.rad(mang) + local cxy = nsize/2.0 + + im:fill(0, 0, white) + im:filledArc(cxy, cxy, ediam, ediam, 0, 360, blue, gd.ARC) + + im:setThickness(math.max(0.02 * ediam, 1)) + for i = 0, 360, 10 do + im:arc(cxy, cxy, odiam, odiam, i, i+5, gray) + end + im:setThickness(1) + + -- Moon + local mcx = cxy + math.sin(math.rad(mang)) * emdist + local mcy = cxy - math.cos(math.rad(mang)) * emdist + im:filledArc(mcx, mcy, mdiam, mdiam, 0, 360, blue, gd.ARC) + + -- Moon shadow + local mscx = cxy + math.sin(math.rad(mang)) * esdist + local mscy = cxy - math.cos(math.rad(mang)) * esdist + im:filledArc(mscx, mscy, mdiam, mdiam, 0, 360, white, gd.ARC) + + im:stringFT(white, "Helvetica", 0.23*nsize, 0, 0.25*nsize, 0.7*nsize, "Lua") + + -- Implementation of the "Desperate anti-aliasing algorithm" ;) + local im2 = gd.createTrueColor(size, size) + im2:copyResampled(im, 0, 0, 0, 0, size, size, nsize, nsize) + return im2 +end + +makelogo(140):png("out.png") +os.execute("xdg-open out.png") diff --git a/demos/paper.png b/demos/paper.png new file mode 100644 index 0000000000000000000000000000000000000000..a9092c44476eb09d1a78c2fffe84ccbfa0871ef1 GIT binary patch literal 4891 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

    sbr<#<`;pwJgnZn8W2}MB7Nmja{;L8st zqat`^js^f%;St%U+Qi+@-DENhR8^wJOAZY74iQ#<-F7^Oa&D~q;;1}-whX+Q3WYqE z5PKM{l{BViHSk3qclilTK)S_-(lUMckU_kga6ch=JIbv^^rd;c8ge=c`#>%PCzFVF zlATx`IWO)5Ic<9y({JpDEZMa#sA-dU_D$R7bMZ%7&Tn)w{)3>Yx{lfPHS7;RmYI=} zi&noAR3k4%)H_Ue{UeSlL;AOumG)yQZWMHi)rSY&sZavQWszSW!4&>X~s*|2I zfEu{70$HF*jl47=CYLERzmZs}YsZp>E5+Il7&5X7rIT%XidX#`DDlKntA|3bZ$dCi zyYs`+wbBzIHmHD_W;39R-cV4o$MXF*>pq2|?^UfQ^5pDVE7vbZ z&_^+DNkrZjzawoWx3o0a+(Jmx`!1r)*_sHv6)Ey(f8e@9ztl_8k!-!5IKox)xbOsT zu2kElRChQYYktAdYD%R)=`Z zR;A{cIlG-!b$+>@1#XFKIch%u97e5}V{;@ctA%M1g>o5JcwmQROlJPJUzZw}bD_il z6D?)NtoZfc#0KiH(#+uZzuR{hfW=c4Z0&&;gRSvVu)Bq>L)F`Paz+IQy&l2KSc^89 z72JwJTsgQkR_g|bE(pgY4d9C-#S5a|0`e@u#G&ezGdI_99=EJU8!H8^CQ_!Ab-G4N zqj3U8iUfsqeF>SmYgx~=?xN8b#)-fF@cJkCqc7A_%Y*KBHr!ijELpp-$(CgQ>|&j9 zitEnIq0uDHhJUY*q_s6UY`cIF!!x6B4v>4e0n(w z%VpN)AG@fju(mQ1_vf#iAyo#Hx^ICy-}Qg2O|`RFw64<zO7G04|b&if#rypCB%kvx?^1T*i1$w7#NA63Tx%PbW!Q5770{ zIGzp$3NA3P`yQH8M@Q1RiY(n=g?chGLgm6P zhPj5i+)7eQ^`1tqlJo80xkHT?xbsSRtMINnRi2YCI8rqf?v@K{GbI|hh zVOMaU+**=*vy*&nqO>R&lXY9fFK&ur6@y@{ef`7udTDbFlGJHgZ|x@*N(;m4*)~tI zwts=+eyH+(DsP~dHyfnR?5usBuA~|8fb4x(*w}aV=#p#*gns{5VIJ*~y13M`|NjGP zMpq_52bhm$&)%(z#=pSOEJ6qJFQ6*)JbM3sgJH{MtT{vnfDWYf51Nc(|MUDNm+`O~ wy+3gA3f_t4L(6GD3tB?=+7(;@v40b|WfKi3O;=m|_t#5NPEEE(#`M#F0EL5;U;qFB literal 0 HcmV?d00001 diff --git a/demos/poly.lua b/demos/poly.lua new file mode 100755 index 000000000..2a16cc16f --- /dev/null +++ b/demos/poly.lua @@ -0,0 +1,16 @@ +#!/usr/bin/env lua + +local gd = require("gd") + +local im = gd.createTrueColor(80, 80) +assert(im) + +local black = im:colorAllocate(0, 0, 0) +local white = im:colorAllocate(255, 255, 255) + +im:polygon( { { 10, 10 }, { 10, 20 }, { 20, 20 }, { 20, 10 } }, white) +im:filledPolygon( { { 30, 30 }, { 30, 40 }, { 40, 40 }, { 40, 30 } }, white) +im:openPolygon( { { 50, 50 }, { 50, 60 }, { 60, 60 }, { 60, 50 } }, white) + +im:png("out.png") +print(os.execute("xdg-open out.png")) diff --git a/demos/setstyle.lua b/demos/setstyle.lua new file mode 100755 index 000000000..4560c9fa5 --- /dev/null +++ b/demos/setstyle.lua @@ -0,0 +1,36 @@ +#!/usr/bin/env lua + +local gd = require("gd") + +local im = gd.createPalette(150, 100) +assert(im, "Failed to create new image.") + +local white = im:colorAllocate(255, 255, 255) +local red = im:colorAllocate(200, 0, 0) +local green = im:colorAllocate(0, 128, 0) +local blue = im:colorAllocate(0, 0, 128) + +local style = {} + +for i = 0, 10 do + style[#style+1] = red +end + +for i = 0, 5 do + style[#style+1] = blue +end + +for i = 0, 2 do + style[#style+1] = green +end + +im:setStyle(style) + +for i = 0, 100, 2 do + im:line(i, i, i+50, i, gd.STYLED) +end + +im:png("out.png") +os.execute("xdg-open out.png") + + diff --git a/demos/stdfont.lua b/demos/stdfont.lua new file mode 100755 index 000000000..42aafca3c --- /dev/null +++ b/demos/stdfont.lua @@ -0,0 +1,22 @@ +#!/usr/bin/env lua + +local gd = require("gd") + +local x, y = 140, 110 + +local im = gd.createPalette(x, y) +local white = im:colorAllocate(255, 255, 255) +local black = im:colorAllocate(0, 0, 0) + +im:string(gd.FONT_TINY, 10, 10, "gd.FONT_TINY", black) +im:string(gd.FONT_SMALL, 10, 20, "gd.FONT_SMALL", black) +im:string(gd.FONT_MEDIUM, 10, 35, "gd.FONT_MEDIUM", black) +im:string(gd.FONT_LARGE, 10, 48, "gd.FONT_LARGE", black) +im:string(gd.FONT_GIANT, 10, 65, "gd.FONT_GIANT", black) + +im:line(60, 93, 70, 93, black) +im:string(gd.FONT_SMALL, 80, 86, "= 10 px", black) + +im:png("out.png") +os.execute("xdg-open out.png") + diff --git a/demos/steg.lua b/demos/steg.lua new file mode 100755 index 000000000..a822bc1b5 --- /dev/null +++ b/demos/steg.lua @@ -0,0 +1,361 @@ +#!/usr/bin/env lua +--[[ + + Steganography with Lua-GD + +Steganography is the technique of writing hidden messages in such a way +that no one apart from the intended recipient knows of the existence of +the message; this is in contrast to cryptography, where the existence +of the message is clear, but the meaning is obscured. Generally a +steganographic message will appear to be something else, like a shopping +list, an article, a picture, or some other "cover" message. In the +digital age, steganography works by replacing bits of useless or unused +data in regular computer files (such as graphics, sound, text, HTML, or +even floppy disks) with bits of different, invisible information. This +hidden information can be plain text, cipher text or even images. + + + A Simple Example + +If Alice wants to send a secret message to Bob through an insecure +channel, she can use some encryption software (like GnuPG) to encrypt +the message with Bob's public key. It's a good solution because no +one unless Bob will be able to read the message. She can also sign the +message so Bob will know that the message really comes from her. BUT, +a potential attacker will know that a ciphered message was sent. If the +attacker has control over the communication channel, he might block the +message in some way that Bob will never receive it. If Alice also HIDES +the ciphertext in an unsuspected piece of information (like a photo of her +cat) the attacker will not detect it and the message will arrive to Bob. + +This program will help Alice to hide some arbitrary text in a PNG image by +replacing the least significant bits of each color channel of some pixels +with bits from the encrypted message. PNG or other loseless compression +algorithm are mandatory here, since compressing the image with a lossy +algorithm will destroy the stored information. The maximum length of the +message is limited by the image's size (each byte needs 8 color channels or +2 pixels and 2 channels from the next pixel). So, the image must have at +least "ceil((length+1)*8/3)" pixels (the extra byte is the NUL marker for +the end of the string). So, if Alice's message is "Meet me in the secret +place at nine o'clock.", she will encrypt and sign it to something like +"PyJYDpz5LCOSHPiXDvLHmVzxLV8qS7EFvZnoo1Mxk+BlT+7lMjpQKs" (imagine Alice's +cat walking in you keyboard :). This is the ciphertext that will be sent +to Bob through the image. + +The following table shows what happens to the first eight pixels from +the image when mixed to the first three bytes from the encrypted message: + + + +-----+---+----------+-----------------+----------+ + | Pix | C | Orig img | Message | New img | + | # | | bits | Chr | Dec | Bin | bits | + +-----+---+----------+-----+-----+-----+----------+ + | | R | 01010010 | | | 0 | 01010010 | + | 1 | G | 00101010 | | | 1 | 00101011 | + |_____| B | 00010101 | | | 0 | 00010100 | + | | R | 11100100 | P | 080 | 1 | 11100101 | + | 2 | G | 00100100 | | | 0 | 00100100 | + |_____| B | 01001111 | | | 0 | 01001110 | + | | R | 01010010 | | | 0 | 01010010 | + | 3 | G | 00101110 |_____|_____|__0__| 00101110 | + |_____| B | 00111001 | | | 0 | 00111000 | + | | R | 10010110 | | | 1 | 10010111 | + | 4 | G | 01011101 | | | 1 | 01011101 | + |_____| B | 00100101 | y | 121 | 1 | 00100101 | + | | R | 01001001 | | | 1 | 01001001 | + | 5 | G | 10110110 | | | 0 | 10110110 | + |_____| B | 00010101 | | | 0 | 00010100 | + | | R | 00110100 |_____|_____|__1__| 00110101 | + | 6 | G | 01000111 | | | 0 | 01000110 | + |_____| B | 01001000 | | | 1 | 01001001 | + | | R | 01010110 | | | 0 | 01010110 | + | 7 | G | 00011001 | | | 0 | 00011000 | + |_____| B | 10010100 | J | 074 | 1 | 10010101 | + | | R | 00010101 | | | 0 | 00010100 | + | 8 | G | 01011010 | | | 1 | 01011011 | + | | B | 01010001 | | | 0 | 01010000 | + +-----+---+----------+-----+-----+-----+----------+ + + +When Bob wants to read the message he will extract the least significant +bit (LSB) from each color channel from some pixels of the image and +join them to get the original ciphertext. A NULL character (ASCII #0) +will mark the end of the message within the image, so he will know when +to stop. Of course, this program will also do this boring job for Bob. + + +]] + + +local gd = require("gd") + + +local function getLSB(n) + return (n % 2) ~= 0 +end + + +-- Bizarre way to do some bit-level operations without bitlib. +local function setLSB(n, b) + if type(b) == "number" then + if b == 0 then + b = false + else + b = true + end + end + if getLSB(n) then + if b then + return n + elseif n > 0 then + return n - 1 + else + return n + 1 + end + else + if not b then + return n + elseif n > 0 then + return n - 1 + else + return n + 1 + end + end +end + + +local function intToBitArray(n) + local ret = {} + local i = 0 + while n ~= 0 do + ret[i] = getLSB(n) + n = math.floor(n/2) + ret.size = i + i = i + 1 + end + return ret +end + + +local function printBitArray(a) + local i + for i = a.size,0,-1 do + if a[i] then + io.write("1") + else + io.write("0") + end + end +end + + +local function mergeMessage(im, msg) + local w, h = im:sizeXY() + msg = msg .. string.char(0) + local len = string.len(msg) + if h * w < len * 8 then + return nil + end + local x, y = 0, 0 + local oim = gd.createTrueColor(w, h) + local i = 1 + local a2, c, nc, chr + local a = {} + local s, e = 1, 1 + local rgb = {} + + while y < h do + c = im:getPixel(x, y) + rgb.r = im:red(c) + rgb.g = im:green(c) + rgb.b = im:blue(c) + if i <= len and e - s < 3 then + a2 = intToBitArray(string.byte(string.sub(msg, i, i))) + for cnt = 7,0,-1 do + a[e+7-cnt] = a2[cnt] + end + i = i + 1 + e = e + 8 + end + if e - s > 0 then + rgb.r = setLSB(rgb.r, a[s]) + a[s] = nil + s = s + 1 + end + if e - s > 0 then + rgb.g = setLSB(rgb.g, a[s]) + a[s] = nil + s = s + 1 + end + if e - s > 0 then + rgb.b = setLSB(rgb.b, a[s]) + a[s] = nil + s = s + 1 + end + nc = oim:colorResolve(rgb.r, rgb.g, rgb.b) + oim:setPixel(x, y, nc) + x = x + 1 + if x == w then + x = 0 + y = y + 1 + end + end + return oim, len*8, w*h +end + + +local function getMessage(im) + local msg = {} + local w, h = im:sizeXY() + local x, y = 0, 0 + local a = {} + local s, e = 1, 1 + local b = 0 + local c + while y <= h do + c = im:getPixel(x, y) + a[e] = getLSB(im:red(c)) + a[e+1] = getLSB(im:green(c)) + a[e+2] = getLSB(im:blue(c)) + e = e + 2 + if e - s >= 7 then + b = 0 + for p = s, s+7 do + b = b * 2 + if a[p] then + b = b + 1 + end + a[p] = nil + end + s = s + 8 + if b == 0 then + return table.concat(msg) + else + msg[#msg+1] = string.char(b) + end + end + e = e + 1 + x = x + 1 + if x == w then + x = 0 + y = y + 1 + end + end + return table.concat(msg) +end + + +local function compare(fimg1, fimg2) + local im1 = gd.createFromPng(fimg1) + if not im1 then + print("ERROR: " .. fimg1 .. " bad PNG data.") + os.exit(1) + end + local im2 = gd.createFromPng(fimg2) + if not im2 then + print("ERROR: " .. fimg2 .. " bad PNG data.") + os.exit(1) + end + local w1, h1 = im1:sizeXY() + local w2, h2 = im2:sizeXY() + if w1 ~= w2 or h1 ~= h2 then + print("ERROR: Images have different sizes.") + os.exit(1) + end + local oim = gd.createTrueColor(w1, h1) + local x, y = 0, 0 + local c1, c2, oc, f, fc + while y < h1 do + c1 = im1:getPixel(x, y) + c2 = im2:getPixel(x, y) + if im1:red(c1) ~= im2:red(c2) + or im1:green(c1) ~= im2:green(c2) + or im1:blue(c1) ~= im2:blue(c2) then + oc = oim:colorResolve(im2:red(c2), im2:green(c2), im2:blue(c2)) + oim:setPixel(x, y, oc) + else + f = math.floor((im1:red(c1) + im1:green(c1) + im1:blue(c1))/6.0) + fc = oim:colorResolve(f, f, f) + oim:setPixel(x, y, fc) + end + x = x + 1 + if x == w1 then + x = 0 + y = y + 1 + end + end + return oim +end + + +local function usage() + print("Usage:") + print(" lua steg.lua hide ") + print(" lua steg.lua show ") + print(" lua steg.lua diff ") + print("") + print(" hide - Reads a message from stdin and saves into .") + print(" show - Reads a message from and prints it to stdout.") + print(" diff - Compares two images and writes the diff to .") + print("") + print(" WARNING: All files used here must be in the PNG format!") +end + + +if not arg[1] or not arg[2] then + usage() + os.exit(1) +end + +if arg[1] == "show" then + local im = gd.createFromPng(arg[2]) + if not im then + print("ERROR: Bad image data.") + os.exit(1) + end + io.write(getMessage(im)) + os.exit(0) +end + +if arg[1] == "hide" then + if not arg[3] then + usage() + os.exit(1) + end + local im = gd.createFromPng(arg[2]) + if not im then + print("ERROR: Bad image data.") + os.exit(1) + end + print("Type your message and press CTRL+D to finish.") + local msg = io.read("*a") + local oim, l, t = mergeMessage(im, msg) + if not oim then + print("ERROR: Image is too small for the message.") + os.exit(1) + end + if not oim:png(arg[3]) then + print("ERROR: Failed to write output file.") + os.exit(1) + end + print(string.format("DONE: %2.1f%% of the image used to store the message.", + 100.0*l/t)) + os.exit(0) +end + +if arg[1] == "diff" then + if not arg[3] and arg[4] then + usage() + os.exit(1) + end + local oim = compare(arg[2], arg[3]) + if not oim:png(arg[4]) then + print("ERROR: Failed to write output file.") + os.exit(1) + end + os.exit(0) +end + +usage() +os.exit(1) + diff --git a/demos/test.lua b/demos/test.lua new file mode 100755 index 000000000..8fa91effa --- /dev/null +++ b/demos/test.lua @@ -0,0 +1,35 @@ +#!/usr/bin/env lua + +local gd = require("gd") + +math.randomseed(os.time()) + +local im = gd.createFromJpeg("./bugs.jpg") +assert(im) +local sx, sy = im:sizeXY() + +local im2 = gd.createTrueColor(2*sx, sy) +local black = im2:colorAllocate(0, 0, 0) +local white = im2:colorAllocate(255, 255, 255) +gd.copy(im2, im, 0, 0, 0, 0, sx, sy, sx, sy) + +local sx2, sy2 = im2:sizeXY() +im2:stringUp(gd.FONT_SMALL, 5, sy2-10, gd.VERSION, white) + +for i = 0, 14 do + for j = 0, 24 do + local rcl = im2:colorAllocate(math.random(255), math.random(255), + math.random(255)) + im2:filledRectangle(sx+20+j*10, i*20+40, sx+30+j*10, i*20+50, rcl) + end +end + +im2:string(gd.FONT_GIANT, sx+80, 10, "Powered by Lua", white) + +local blackTr = im2:colorAllocateAlpha(0, 0, 0, 80) +im2:stringFT(blackTr, "./Vera.ttf", 140, 0, 70, 130, "gd") +im2:stringFT(white, "./Vera.ttf", 45, math.pi/5, 340, 250, "FreeType") + + +im2:png("out.png") +os.execute("xdg-open out.png") diff --git a/demos/test2.lua b/demos/test2.lua new file mode 100755 index 000000000..93a575901 --- /dev/null +++ b/demos/test2.lua @@ -0,0 +1,19 @@ +#!/usr/bin/env lua + +local gd = require("gd") + +local im = gd.createFromJpeg("./bugs.jpg") +assert(im) + +local white = im:colorAllocate(255, 255, 255) +im:string(gd.FONT_MEDIUM, 10, 10, "Powered by", white) + +local imlua = gd.createFromPng("./lua-gd.png") +-- imlua:colorTransparent(imlua:getPixel(0, 0)) + +local sx, sy = imlua:sizeXY() +gd.copy(im, imlua, 10, 25, 0, 0, sx, sy, sx, sy) +im:string(gd.FONT_MEDIUM, 10, 330, "http://ittner.github.com/lua-gd/", white) + +im:png("out.png") +os.execute("xdg-open out.png") diff --git a/demos/ttftext.lua b/demos/ttftext.lua new file mode 100755 index 000000000..c5e21e030 --- /dev/null +++ b/demos/ttftext.lua @@ -0,0 +1,30 @@ +#!/usr/bin/env lua + +local gd = require("gd") + +local function boxedtext(im, color, font, size, ang, x, y, text, bcolor) + local font = "./" .. font .. ".ttf" + local llx, lly, lrx, lry, urx, ury, ulx, uly = + im:stringFT(color, font, size, math.rad(ang), x, y, text) + im:polygon({ {llx, lly}, {lrx, lry}, {urx, ury}, {ulx, uly} }, bcolor) +end + +local im = gd.createTrueColor(400, 400) +assert(im) + +local black = im:colorAllocate(0, 0, 0) +local grayt = im:colorAllocateAlpha(255, 255, 255, 70) +local bluet = im:colorAllocateAlpha(0, 0, 250, 70) +local redt = im:colorAllocateAlpha(255, 0, 0, 0) +local greent = im:colorAllocateAlpha(0, 250, 0, 70) +local lbluet = im:colorAllocateAlpha(180, 180, 255, 70) +local yellowt = im:colorAllocateAlpha(240, 240, 0, 70) + +boxedtext(im, yellowt, "Vera", 300, 0, 60, 350, "A", bluet) +boxedtext(im, greent, "Vera", 80, 45, 60, 220, "Ithil", bluet) +boxedtext(im, redt, "Vera", 45, 90, 380, 300, "Lua-GD", bluet) +boxedtext(im, lbluet, "Vera", 36, 290, 160, 130, "FreeType", bluet) +boxedtext(im, grayt, "Vera", 26, 180, 390, 360, "Turn 180° before read", bluet) + +im:png("out.png") +os.execute("xdg-open out.png") diff --git a/demos/ttftextex.lua b/demos/ttftextex.lua new file mode 100755 index 000000000..797f17505 --- /dev/null +++ b/demos/ttftextex.lua @@ -0,0 +1,49 @@ +#!/usr/bin/env lua + +local gd = require("gd") + +gd.useFontConfig(true) -- Use Fontconfig by default. + +local im = gd.createTrueColor(400, 400) +assert(im) + +local black = im:colorAllocate(0, 0, 0) +local grayt = im:colorAllocateAlpha(255, 255, 255, 80) +local blue = im:colorAllocate(0, 0, 250) +local red = im:colorAllocate(255, 0, 0) +local green = im:colorAllocate(0, 250, 0) +local lblue = im:colorAllocate(180, 180, 255) +local yellow = im:colorAllocate(240, 240, 0) + +im:stringFTEx(lblue, "Vera", 20, 0, 40, 40, "Half\nspace", + { linespacing = 0.5 } ) + +im:stringFTEx(red, "Vera", 20, 0, 140, 40, "Single\nspace", + { linespacing = 1.0 } ) + +im:stringFTEx(green, "Vera", 20, 0, 240, 40, "Double\nspace", + { linespacing = 2.0 } ) + +im:stringFTEx(yellow, "Vera", 40, 0, 80, 140, "Distorted!", + { hdpi = 96, vdpi = 30 } ) + + +local k = "Kerniiiiiiiiiiiiiiiiiing?" +print(im:stringFTEx(red, "Vera", 30, 0, 10, 200, k, {})) +print(im:stringFTEx(red, "Vera", 30, 0, 10, 240, k, + { disable_kerning = true } )) + +for i = 10, 400, 10 do + im:line(i, 170, i, 250, grayt) +end + + +local llX, llY, lrX, lrY, urX, urY, ulX, ulY, fontpath = + im:stringFTEx(lblue, "Vera", 20, 0, 50, 320, "This font comes from", + { return_font_path_name = true } ) + +im:string(gd.FONT_MEDIUM, 10, 340, fontpath, lblue) + + +im:png("out.png") +os.execute("xdg-open out.png") diff --git a/demos/utf-8.lua b/demos/utf-8.lua new file mode 100755 index 000000000..a0fafedc5 --- /dev/null +++ b/demos/utf-8.lua @@ -0,0 +1,35 @@ +#!/usr/bin/env lua +-- -*- coding: utf-8 -*- + +-- UTF-8 encoded unicode text. You must use an UTF-8 compatible text editor +-- to change this and a compatible Unicode font (FreeSerif is a good one). +-- +-- WARNING: Windows Notepad will add some prefixes, making this file an +-- invalid Lua script. + +local gd = require("gd") + +local text = [[ +⌠ ☾ Lua-GD +⌡ Unicode/UTF-8 +↺↻⇒✇☢☣☠ +♜♞â™â™›â™šâ™â™žâ™œ +♟♟♟♟♟♟♟♟ +♙♙♙♙♙♙♙♙ +♖♘♗♕♔♗♘♖ +]] + +local fontname = "FreeSerif" -- Common on Unix systems +-- local fontname = "Arial Unicode" -- Common on Windows systems + +gd.useFontConfig(true) + +local im = gd.createTrueColor(180, 180) +local white = im:colorAllocate(255, 255, 255) +local black = im:colorAllocate(0, 0, 0) +local x, y = im:sizeXY() +im:filledRectangle(0, 0, x, y, white) +im:stringFT(black, fontname, 16, 0, 10, 30, text) + +im:png("out.png") +os.execute("xdg-open out.png") diff --git a/doc/cat.png b/doc/cat.png new file mode 100644 index 0000000000000000000000000000000000000000..2e9385c99d86579112be9c9a619e7281023357d9 GIT binary patch literal 102810 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 f$}3_bL^An*7gEgO^{V_~00000NkvXXu0mjfCQj

    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%0D=$vhX|S()$=xxa0TY$J2xzubF7o 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񬒫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 B^o#%i literal 0 HcmV?d00001 diff --git a/doc/clock-example.png b/doc/clock-example.png new file mode 100644 index 0000000000000000000000000000000000000000..852fe595443aff51369ecf03b25d7ac8ca5ff29a GIT binary patch literal 982 zcmV;{11bE8P)Nkl z-Fm|y2!?gf?z{2I-GQx3l^9S^jJ`+fwkUi7{Ao?C_ulBkTC32okv3Ut>nk5}USNbbR=qUC} zy&MC7&FYyKIib_27q1PRVs*>7TcQoTCb6X<$t>?*#+Y&@vJeA}r8S<&(m96=M7`QA zY!ypS>Xiw#-?W+9l!oA7S22)Dked;Q%lbxr73FJ>XX0+*51Ev!`4_`sF#fLKWaD%qbB#W|O_2__>@nDS~B8fx4&Imb@2 zz8Smdan6CR%>bE_+oGT(c- zGj(wNi`6Zx=F;mNTv`^=I%|Bw7_sIGuE<-gUD^x8OdOVmGX~elnw99KzieqK@Kazz zLJllgc_?XHBnGUtJF*Cj7fWXxfs7X`M{SK)A=WIxr9vz-iC$X7ngT^)or3F-J5thu zBC$Rk@h5G1rRQv}-uM#zMC_MA-vafSEf?PIi;llfZK>LF7$O!1jWhVOI(n1}^gi~B zL7PSqb&;i+Ef#?-7J)4mfh`t+Ef#?vgZl{h;)Hqojw}LOECO3B0&lT)*(wk>8g^t6 z*kTd*7i(uC$a%AGM;3uEv377JBzwp^vIxLucaq=aM_Zo6m1{tffsblAzifOg%oH5Q zk-M3TgF5K6CbZJ46Z`SF3qzR)T=zW?MW$t z8?lxOuG=}&ePk`77iM;eO~YsFh4c<3)(SHTjE{ts&GVl5XNXP_Mnli~P-hKLZ$EA7 zfNXd8eh%IMTB1~JXp}Ex+0tomMB<6THIq_5c|O(`-|AcEq3tm)yKJP8$JT#E#H89GAY~Vj(5hWXvn4-68 ze^(f#i#~T=?uPfw`rbqSc?78Lnx&DNel?U~Dx+-v1A_aA6imT5`2YX_07*qoM6N<$ Ef^jU$!~g&Q literal 0 HcmV?d00001 diff --git a/doc/fontconfig-example.png b/doc/fontconfig-example.png new file mode 100644 index 0000000000000000000000000000000000000000..bc07563a8ed47f070947c24e682b719c71e1d3fa GIT binary patch literal 13816 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 Fe*j{f-|zqc literal 0 HcmV?d00001 diff --git a/doc/gifanim.gif b/doc/gifanim.gif new file mode 100644 index 0000000000000000000000000000000000000000..804b025e5cda3af66836cc81fb5af3f5c3b11f83 GIT binary patch literal 7005 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 Y={)s&I;+qx&a= + + + + + + Lua-GD Reference Manual + + + + + + + + + + +

    + + Lua-GD Logo + +

    Lua-GD 2.0.33r3

    +
    + + +

    Contents

    + + + +

    Introduction

    + +

    "gd" is a C graphics library created by +Thomas Boutell that allows +your code to quickly draw complete images with lines, polygons, arcs, +text, multiple colors, cut and paste from other images, flood fills, +read in or write out images in the PNG, JPEG or GIF format. This is +particularly useful in World Wide Web applications, where PNG and JPEG are +two of the formats accepted for inline images by most browsers. gd does +not provide for every possible desirable graphics operation. It is not +necessary or desirable for gd to become a kitchen-sink graphics package, +but it does include most frequently requested features, including both +truecolor and palette images, resampling (smooth resizing of truecolor +images) and so forth. You can get more information about gd from +it's homepage.

    + +

    Lua-GD is a "binding": a library that exports gd functions to the Lua Programming Language, allowing you to +use gd from Lua. The API was not literally exported, but changed +in a way that make it familiar to Lua users.

    + +

    Lua-GD is a programming library, not a paint program. If you are +looking for that or are not familiar to the Lua Programming Language, +you are in the wrong place.

    + +

    This document, which was heavly based on gd manual, describes the API +and provides the information needed to use the library. Some experience +with Lua is required.

    + +

    A note on version numbers: Lua-GD version numbers is in +the format "X.Y.ZrW", where X.Y.Z indicates the gd version and W the +binding version. So, the 2.0.33r1 version is the first binding +version for gd 2.0.33 and 2.0.33r2 has some improvements/bug +fixes/etc. but were based in the same gd version.

    + + + +

    Licensing information

    + +

    Lua-GD and gd have diferent licenses. In order to use Lua-GD in your +application, you need to accept both them.

    + +

    Lua-GD License

    + +

    Lua-GD is copyrighted free software, distributed under the +MIT license (the same used by Lua 5.1) and it can be used at no cost for +both academic and commercial purpouses. Or, more precisely:

    + + +
    +Lua-GD (c) 2004-2013 Alexandre Erwin Ittner
    +
    +Permission is hereby granted, free of charge, to any person obtaining
    +a copy of this software and associated documentation files (the
    +"Software"), to deal in the Software without restriction, including
    +without limitation the rights to use, copy, modify, merge, publish,
    +distribute, sublicense, and/or sell copies of the Software, and to
    +permit persons to whom the Software is furnished to do so, subject to
    +the following conditions:
    +
    +The above copyright notice and this permission notice shall be
    +included in all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
    +IN NO EVENT SHALL THE AUTHOR OR COPYRIGHT HOLDER BE LIABLE FOR ANY
    +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
    +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    +
    +If you use this package in a product, an acknowledgment in the product
    +documentation would be greatly appreciated (but it is not required).
    +
    + + +

    gd License

    + +
    +

    Portions copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004 by Cold Spring Harbor Laboratory. Funded under Grant +P41-RR02188 by the National Institutes of Health.

    + +

    Portions copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, +2004 by Boutell.Com, Inc.

    + +

    Portions relating to GD2 format copyright 1999, 2000, 2001, 2002, +2003, 2004 Philip Warner.

    + +

    Portions relating to PNG copyright 1999, 2000, 2001, 2002, 2003, +2004 Greg Roelofs.

    + +

    Portions relating to gdttf.c copyright 1999, 2000, 2001, 2002, 2003, +2004 John Ellson (ellson@graphviz.org).

    + +

    Portions relating to gdft.c copyright 2001, 2002, 2003, 2004 John +Ellson (ellson@graphviz.org).

    + +

    Portions relating to JPEG and to color quantization copyright 2000, +2001, 2002, 2003, 2004, Doug Becker and copyright (C) 1994, 1995, 1996, +1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Thomas G. Lane. This +software is based in part on the work of the Independent JPEG Group. See +the file README-JPEG.TXT for more information.

    + +

    Portions relating to GIF compression copyright 1989 by Jef Poskanzer +and David Rowley, with modifications for thread safety by Thomas +Boutell.

    + +

    Portions relating to GIF decompression copyright 1990, 1991, 1993 by +David Koblas, with modifications for thread safety by Thomas Boutell.

    + +

    Portions relating to WBMP copyright 2000, 2001, 2002, 2003, 2004 +Maurice Szmurlo and Johan Van den Brande.

    + +

    Portions relating to GIF animations copyright 2004 Jaakko Hyvätti +(jaakko.hyvatti@iki.fi)

    + +

    Permission has been granted to copy, distribute and modify gd in any +context without fee, including a commercial application, provided that +this notice is present in user-accessible supporting documentation.

    + +

    This does not affect your ownership of the derived work itself, and the +intent is to assure proper credit for the authors of gd, not to interfere +with your productive use of gd. If you have questions, ask. "Derived +works" includes all programs that utilize the library. Credit must be +given in user-accessible documentation.

    + +

    This software is provided "AS IS." The copyright holders disclaim +all warranties, either express or implied, including but not limited +to implied warranties of merchantability and fitness for a particular +purpose, with respect to this code and accompanying documentation.

    + +

    Although their code does not appear in the current release, the +authors also wish to thank Hutchison Avenue Software Corporation for +their prior contributions.

    + +
    + + + +

    Development

    + +

    Lua-GD is developed in GitHub. +Bug reports, patches, pull requests, ports to other systems, etc. are +welcome.

    + + + + +

    Download and installation

    + +

    The most recent stable packages are available in the +Lua-GD releases page +in GitHub and in the +mirror on Sourceforge. +There are also some pre-compiled binary packages available for Linux and some +other Unix systems.

    + +

    After downloading, you need to compile the library. This process +requires GNU Make, gd and its dependencies (libpng, libjpeg, FreeType2, +fontconfig, etc.) installed on your system. Some components that may +be disabled on your gd installation will be disabled in Lua-GD too. To +compile on Unix, just unpack the distribution package, enter the directory +and type make in your favourite shell. If the compilation +was successful, you will see something like:

    + +
    +gcc -o gd.so `gdlib-config --features |sed -e "s/GD_/-DGD_/g"`
    +`gdlib-config --cflags` `pkg-config lua5.1 --cflags` -O3 -Wall -shared
    +`gdlib-config --ldflags` `gdlib-config --libs` `pkg-config lua5.1 --libs`
    +-lgd luagd.c
    +lua test_features.lua
    +Lua-GD version: lua-gd 2.0.33r3
    +Lua-GD features:
    +    PNG support ..................... Enabled
    +    GIF support ..................... Enabled
    +    JPEG support .................... Enabled
    +    XPM/XBM support ................. Enabled
    +    FreeType support ................ Enabled
    +    Fontconfig support .............. Enabled
    +
    + +

    To install the library with Lua 5.1 and above just type +make install, as root.

    + +

    Warning: This will work only in systems with pkg-config (which +includes the major Linux distributions). In other systems, you will need to +edit the Makefile and manually install the library, by copying the 'gd.so' +file to your Lua binary modules directory.

    + +

    Compiling Lua-GD on Windows systems is almost, but not quite, +entirely unlike compiling it on Unix. You will need to edit the Makefile +by yourself.

    + +

    A note to Debian/Ubuntu users: To enable the Fontconfig and XPM +support, you will need the libgd2-xpm and libgd2-xpm-dev +packages. The libgd2-noxpm does not have Fontconfig support.

    + + +

    Installing with LuaRocks

    + +

    The installation procedure described above can be automated with +LuaRocks. If you have it in your +system, just type sudo luarocks install luagd +to download, build, and install Lua-GD.

    + + +

    Library loading and initialization

    + +

    Lua-GD uses the Lua 5.1 package system that allows you to simply do a

    + +
    local gd = require("gd")
    + +

    call to load up the library.

    + +

    Compatibility notice: Until version 2.0.33r2, Lua-GD +exported a global table called "gd" (as usually done for Lua 5.0 libraries). +Versions 2.0.33.r3 and newer dropped Lua 5.0 compatibility and no longers +changes the global environment, so an explicit attribution is necessary.

    + + + +

    Lua-GD API

    + +

    The Lua-GD API is not identical to the gd C API: it was changed in +a way that make it more familiar to Lua users and use the extra power +provided by Lua, at cost of some learning for those that already use +gd.

    + +

    All the functions and constants are stored on a single table returned by +require and stored to a variable conventionally named +gd. Images are objects and they can use the +common colon notation for its methods, but you can also use a C-style +syntax. So, the following two lines are equivalent:

    + +
    +local gray1 = im:colorResolve(128, 128, 128)        -- Using the colon notation
    +local gray2 = gd.colorResolve(im, 128, 128, 128)    -- Using a C-style notation
    +
    + +

    Constants, functions and methods are described bellow.

    + + + +

    Constants

    + +

    gd.VERSION

    +

    A string with the version and some information about the library.

    + +

    gd.MAX_COLORS

    +

    The constant 256. This is the maximum number of colors in a +palette-based PNG file according to the PNG standard, and is also the +maximum number of colors in a palette-based gd image. This of course +does not apply to truecolor images.

    + +

    gd.GD2_FMT_RAW
    +gd.GD2_FMT_COMPRESSED

    + +

    Used when saving images to GD2 files with gd2 and +gd2Str to indicate the image file format. This format is not +intended for general purpose use and should never be used to distribute +images. It is a file format allowing pseudo-random access to large +image files. Its purpose is solely to allow very fast loading of parts +of images. You should use GD2_FMT_RAW for faster loading +(and bigger files) or GD2_FMT_COMPRESSED for smaller files (and slower +loading).

    + + +

    gd.ARC
    +gd.CHORD
    +gd.PIE
    +gd.NO_FILL
    +gd.EDGED

    + +

    These constants are used with the method filledArc +and can be added together. gd.ARC, gd.CHORD, +gd.PIE (synonym for gd.CHORD), +gd.NO_FILL and gd.EDGED are mutually +exclusive; gd.CHORD just connects the starting and +ending angles with a straight line, while gd.ARC +produces a rounded edge. gd.PIE is a synonym for +gd.ARC. gd.NO_FILL indicates that the arc +or chord should be outlined, not filled. gd.EDGED, used +together with gd.NO_FILL, indicates that the beginning and +ending angles should be connected to the center; this is a good way to +outline (rather than fill) a 'pie slice'. See gd.filledArc +for details.

    + + +

    gd.ANTI_ALIASED

    + +

    Used in place of a color when invoking a line-drawing method +such as gd.line or gd.rectangle. When +gd.ANTI_ALIASED is used as the color, the foreground color +set with gd.setAntiAliased is used, with antialiasing +mechanisms to minimize any "jagged" appearance. For more information, +see gd.setAntiAliased.

    + + +

    gd.BRUSHED

    + +

    Used in place of a color when invoking a line-drawing method +such as gd.line or gd.rectangle. When +gd.BRUSHED is used as the color, the brush image set with +gd.setBrush is drawn in place of each pixel of the line +(the brush is usually larger than one pixel, creating the effect of a +wide paintbrush). See also gd.STYLED_BRUSHED for a way to +draw broken lines with a series of distinct copies of an image.

    + + +

    gd.STYLED

    + +

    Used in place of a color when invoking a line-drawing method +such as gd.line or gd.rectangle. When +gd.STYLED is used as the color, the colors of the +pixels are drawn successively from the style that has been set +with gd.setStyle. If the color of a pixel is equal to +gd.TRANSPARENT, that pixel is not altered. (This mechanism +is completely unrelated to the "transparent color" of the image itself; +see gd.colorTransparent for that mechanism).

    + + +

    gd.STYLED_BRUSHED

    + +

    Used in place of a color when invoking a line-drawing method +such as gd.line or gd.rectangle. When +gd.STYLED_BRUSHED is used as the color, the brush image +set with gd.setBrush is drawn at each pixel of the line, +providing that the style set with gd.setStyle contains +a nonzero value (OR gd.TRANSPARENT, which does not equal +zero but is supported for consistency) for the current pixel. (Pixels +are drawn successively from the style as the line is drawn, returning to +the beginning when the available pixels in the style are exhausted). Note +that this differs from the behavior of gd.STYLED, in which +the values in the style are used as actual pixel colors, except for +gd.TRANSPARENT.

    + + +

    gd.TILED

    + +

    Used in place of a normal color in gd.filledRectangle, +gd.filledPolygon, gd.fill, and + gd.fillToBorder. gd.TILED +selects a pixel from the tile image set with gd.setTile +in such a way as to ensure that the filled area will be tiled with +copies of the tile image. See the discussions of gd.fill +and gd.fillToBorder for special restrictions regarding +those methods.

    + + +

    gd.TRANSPARENT

    + +

    Used in place of a normal color in a style to be set with +gd.setStyle. gd.TRANSPARENT is not +the transparent color index of the image; for that functionality please +see gd.colorTransparent.

    + + +

    gd.FONT_TINY
    +gd.FONT_SMALL
    +gd.FONT_MEDIUM
    +gd.FONT_LARGE
    +gd.FONT_GIANT

    + +

    These are the standard gd fonts used by gd.string and +gd.stringUp. Sizes and styles are shown bellow:
    + +Standard gd fonts
    + +If you need another fonts, you should use TrueType fonts with +gd.stringFT. +

    + +

    gd.FTEX_Unicode
    +gd.FTEX_Shift_JIS
    +gd.FTEX_Big5

    + +

    These are the character maps used by gd.stringFTEx. Explicit +specification of the desired character mapping is useful when a font offers +more than one of Unicode, Shift_JIS, and Big5.

    + + +

    Image creation and destruction

    + + +

    gd.create(x, sy)
    +gd.createPalette(x, y)

    + +

    These functions are used to create palette-based images, with +no more than 256 colors. Invoke gd.create with the x +and y dimensions of the desired image to return the new image or +nil on error. gd.createPalette is a synomym for +gd.create.

    + +

    Example:

    + +
    +-- creates a 20x20px palette-based image
    +local im = gd.create(20, 20)
    +
    + +

    You don't need to destroy an image by yourself. Lua has a garbage +collector that detects when an piece of information becomes useless and +"automagically" removes it from memory.

    + + +

    gd.createTrueColor(x, y)

    + +

    Used to create truecolor images, with an essentially unlimited +number of colors. Invoke gd.createTrueColor with the x +and y dimensions of the desired image to return the new image or nil +on error. Truecolor images are always filled with black at creation +time. There is no concept of a "background" color index.

    + +

    Example:

    +
    +-- creates a 20x20px true color image
    +local im = gd.createTrueColor(20, 20)
    +
    + +

    You don't need to destroy an image by yourself. Lua has a garbage +collector that detects when an piece of information becomes useless and +"automagically" deletes it from memory.

    + + + +

    gdImage:createPaletteFromTrueColor(dither, colorsWanted)

    + +

    This method creates a new palette-based image from a truecolor +image using a high-quality two-pass quantization routine. If +the dither flag is set to true, the image will be +dithered to approximate colors better, at the expense of some obvious +"speckling". colorsWanted, an integer value, can be anything up +to 256. If the original source image includes photographic information +or anything that came out of a JPEG, 256 is strongly recommended. 100% +transparency of a single transparent color in the original truecolor +image will be preserved. There is no other support for preservation of +alpha channel or transparency in the destination image.

    + +

    For best results, don't use this method -- write real truecolor +PNGs and JPEGs. The disk space gain of conversion to palette is not great +(for small images it can be negative) and the quality loss is ugly.

    + + + + +

    Image input functions

    + + +

    gd.createFromJpeg(filename)

    + +

    gd.createFromJpeg is called to load truecolor images from +JPEG format files. Invoke gd.createFromJpeg with a string +pointing to an existing file containing the desired image to return a new +truecolor image or nil if unable to load the image (most often +because the file is corrupt or does not contain a JPEG image). You can +determine the size of the image with gd.sizeXY. The returned +image is always a truecolor image.

    + + + +

    gd.createFromPng(filename)

    + +

    gd.createFromPng is called to load images from PNG format +files. Invoke gd.createFromPng with a string pointing to +an existing file containing the desired image to return a new image or +nil if unable to load the image (most often because the file is +corrupt or does not contain a PNG image). You can determine the size of +the image with gd.sizeXY.

    + +

    If the PNG image being loaded is a truecolor image, the resulting +value will refer to a truecolor image. If the PNG image being loaded +is a palette or grayscale image, the resulting data will refer to a +palette image. gd retains only 8 bits of resolution for each of the red, +green and blue channels, and only 7 bits of resolution for the alpha +channel. The former restriction affects only a handful of very rare +48-bit color and 16-bit grayscale PNG images. The second restriction +affects all semitransparent PNG images, but the difference is essentially +invisible to the eye. 7 bits of alpha channel resolution is, in practice, +quite a lot.

    + +

    Example:

    +
    +-- copies the content of picture.png to a new image
    +local im = gd.createFromPng("picture.png")
    +
    + + +

    gd.createFromGif(filename)

    + +

    gd.createFromGif is called to load images from GIF format +files. Invoke gd.createFromGif with a string pointing to +an existing file containing the desired image to return a new image or +nil if unable to load the image (most often because the file is +corrupt or does not contain a GIF image). You can determine the size of +the image with gd.sizeXY.

    + + +

    gd.createFromGd(filename)

    + +

    gd.createFromGd is called to load images from gd format +files. Invoke gd.createFromGd with a string pointing to +an existing file containing the desired image to return a new image or +nil if unable to load the image (most often because the file is +corrupt or does not contain a gd image). You can determine the size of +the image with gd.sizeXY. This format is not intended for +general purpose use and should never be used to distribute images. Its +purpose is solely to allow very fast loading of images.

    + + +

    gd.createFromGd2(filename)

    + +

    gd.createFromGd2 is called to load images from gd2 format +files. Invoke gd.createFromGd2 with a string pointing to +an existing file containing the desired image to return a new image or +nil if unable to load the image (most often because the file is +corrupt or does not contain a gd2 image). You can determine the size of +the image with gd.sizeXY. This format is not intended for +general purpose use and should never be used to distribute images. Its +purpose is solely to allow very fast loading of images.

    + + +

    gd.createFromGd2Part(filename, x, y, w, h)

    + +

    gd.createFromGd2Part is called to load parts +of images from gd2 format files. Invoked in the same way as +gd.createFromGd2, but with extra parameters indicating the +source (x, y) and width/height of the desired image.

    + +

    Example:

    +
    +-- Being base.gd2 a 40x40px image, copies its upper-left part to a new image
    +local im = gd.createFromGd2Part("base.gd2", 0, 0, 20, 20)
    +
    + + +

    gd.createFromXbm(filename)

    + +

    gd.createFromXbm is called to load images from +monochromatic X bitmap format files. Invoke gd.createFromXbm +with a string pointing to an existing file containing the desired image +to return a new image or nil if unable to load the image (most +often because the file is corrupt or does not contain a XBM image). You +can determine the size of the image with gd.sizeXY.

    + + +

    gd.createFromXpm(filename)

    + +

    gd.createFromXpm is called to load images from color X +bitmap format files. Invoke gd.createFromXpm with a string +pointing to an existing file containing the desired image to return a +new image or nil if unable to load the image (most often because +the file is corrupt or does not contain a XPM image). You can determine +the size of the image with gd.sizeXY.

    + + +

    gd.createFromJpegStr(string)

    + +

    gd.createFromJpegStr is called to load +truecolor images from strings with JPEG format image data. Invoke +gd.createFromJpegStr passing a string with the desired +image to return a new truecolor image or nil if unable to +load the image (most often because the data is corrupt or does not +contain a JPEG image). You can determine the size of the image with +gd.sizeXY. The returned image is always a truecolor +image.

    + + +

    gd.createFromGifStr(string)

    + +

    gd.createFromGifStr is called to load +palette-based images from strings with GIF format image data. Invoke +gd.createFromGifStr passing a string with the desired image +to return a new image or nil if unable to load the image (most +often because the data is corrupt or does not contain a GIF image). You +can determine the size of the image with gd.sizeXY.

    + + +

    gd.createFromPngStr(string)

    + +

    gd.createFromPngStr is called to load images from strings +with PNG format image data. Invoke gd.createFromPngStr +passing a string with the desired image to return a new image or +nil if unable to load the image (most often because the data is +corrupt or does not contain a PNG image). You can determine the size of +the image with gd.sizeXY.

    + +

    If the PNG image being loaded is a truecolor image, the resulting +value will refer to a truecolor image. If the PNG image being loaded +is a palette or grayscale image, the resulting data will refer to a +palette image. gd retains only 8 bits of resolution for each of the red, +green and blue channels, and only 7 bits of resolution for the alpha +channel. The former restriction affects only a handful of very rare +48-bit color and 16-bit grayscale PNG images. The second restriction +affects all semitransparent PNG images, but the difference is essentially +invisible to the eye. 7 bits of alpha channel resolution is, in practice, +quite a lot.

    + +

    Example:

    + +
    +-- reads the contents of the file to a string
    +fp = io.open("picture.png")
    +str = fp:read("*a")
    +fp:close()
    +
    +-- creates an image from the string
    +local im = gd.createFromPngStr(str)
    +
    + + +

    gd.createFromGdStr(string)

    + +

    gd.createFromGdStr is called to load images from strings +with gd format image data. Invoke gd.createFromGdStr passing +a string with the desired image to return a new image or nil +if unable to load the image (most often because the data is corrupt or +does not contain a gd image). You can determine the size of the image +with gd.sizeXY. This format is not intended for general +purpose use and should never be used to distribute images. Its purpose +is solely to allow very fast loading of images.

    + + +

    gd.createFromGd2Str(string)

    + +

    gd.createFromGd2Str is called to load images from strings +with gd2 format image data. Invoke gd.createFromGd2Str +passing a string with the desired image to return a new image or +nil if unable to load the image (most often because the data is +corrupt or does not contain a gd2 image). You can determine the size of +the image with gd.sizeXY. This format is not intended for +general purpose use and should never be used to distribute images. Its +purpose is solely to allow very fast loading of images.

    + + +

    gd.createFromGd2PartStr(string, x, y, w, h)

    + +

    gd.createFromGd2PartStr is called to load parts +of images from gd2 format strings. Invoked in the same way as +gd.createFromGd2Str, but with extra parameters indicating +the source (x, y) and width/height of the desired image.

    + + +

    Image output methods

    + +

    gdImage:png(filename)

    + +

    Outputs the image to a PNG file with the specified name (overwriting +existing files). This method returns false on error (eg. permission +denied to overwrite an existing file) and true on success.

    + +

    Example:

    + +
    +-- creates a new image
    +local im = gd.createTrueColor(20, 20)
    +
    +-- ** DO SOME ART HERE **
    +
    +-- writes the image to a PNG file.
    +im:png("picture.png")
    +
    + + +

    If you want to check if the writting was succeful:

    +
    +-- creates a new image
    +local im = gd.createTrueColor(20, 20)
    +
    +-- ** DO SOME ART HERE **
    +
    +if im:png("picture.png") then
    +  print("Image written to disk")
    +else
    +  print("Oops, an error...")
    +end
    +
    + + +

    gdImage:pngEx(filename, compression_level)

    + +

    Similiar to gd.png, but allows you to specify the +compression level of a PNG image, from 1 to 6 (or -1 for the default +compression level of libpng). This method returns false on error +(eg. permission denied to overwrite an existing file) and true +on success.

    + + +

    gdImage:jpeg(filename, quality)

    + +

    Outputs the image to a JPEG file with the specified name (overwriting +existing files). You must specify the quality of the generated JPEG +file from 1 (worst quality, small files) to 100 (best quality, large +files). This method returns false on error (eg. permission denied +to overwrite an existing file) and true on success.

    + + + +

    gdImage:gif(filename)

    + +

    Outputs the image to a GIF file with the specified name (overwriting +existing files). This method returns false on error (eg. permission +denied to overwrite an existing file) and true on success.

    + + +

    gdImage:gd(filename)

    + +

    Outputs the image to a gd format file with the specified name +(overwriting existing files). This method returns false on error +(eg. permission denied to overwrite an existing file) and true +on success. This format is not intended for general purpose use and +should never be used to distribute images. Its purpose is solely to +allow very fast loading of images.

    + + +

    gdImage:gd2(filename, chunkSize, format)

    + +

    Outputs the image to a gd2 format file with the specified name +(overwriting existing files). This method returns false on error +(eg. permission denied to overwrite an existing file) and true +on success. You must specify the chunk size (an integer, or 0 for the +default) and the file format, which can be gd.GD2_FMT_RAW +or gd.GD2_FMT_COMPRESSED. This format is not intended for +general purpose use and should never be used to distribute images. Its +purpose is solely to allow very fast loading of images.

    + + +

    gdImage:wbmp(filename, fg)

    + +

    Outputs the image to a WBMP file with the specified name (overwriting +existing files). WBMP file support is black and white only. The color +index specified by the fg argument is the "foreground", and only pixels +of this color will be set in the WBMP file. All other pixels will be +considered "background". This method returns false on error +(eg. permission denied to overwrite an existing file) and true +on success.

    + + +

    gdImage:pngStr()

    + +

    This method returns the image in the PNG format as a Lua string +or nil on error (eg. a corrupted image).

    + + +

    gdImage:pngStrEx(compression_level)

    + +

    Similiar to gd.pngStr, but allows you to specify the +compression level of a PNG image, from 1 to 6 (or -1 for the default +compression level of libpng). This method returns nil on +error.

    + + +

    gdImage:jpegStr(quality)

    + +

    This method returns the image in the JPEG format as a Lua string +or nil on error (eg. a corrupted image). You must specify the +quality of the generated JPEG data from 1 (worst quality, small string) +to 100 (best quality, large string).

    + +

    Example:

    +
    +-- creates a new image
    +local im = gd.createTrueColor(20, 20)
    +
    +-- ** DO SOME ART HERE **
    +-- writes the image to a PNG file.
    +im:png("picture.png")
    +
    +-- writes the image to stdout in the JPEG format
    +io.write(im:jpegStr(75))
    +
    + + + +

    gdImage:gifStr()

    + +

    This method returns the image in the GIF format as a Lua string +or nil on error (eg. a corrupted image).

    + + +

    gdImage:gdStr()

    + +

    This method returns the image in the gd format as a Lua string +or nil on error (eg. a corrupted image).

    + + +

    gdImage:gd2Str(chunkSize, format)

    + +

    This method returns the image in the gd2 format as a Lua string or +nil on error (eg. a corrupted image). You must specify the chunk +size (an integer, or 0 for the default) and the data format, which can be +gd.GD2_FMT_RAW or gd.GD2_FMT_COMPRESSED. This +format is not intended for general purpose use and should never be used +to distribute images. Its purpose is solely to allow very fast loading +of images.

    + + +

    gdImage:wbmpStr(fg)

    + +

    This method returns the image in the WBMP format as a Lua string +or nil on error (eg. a corrupted image). WBMP format support is +black and white only. The color index specified by the fg argument is +the "foreground", and only pixels of this color will be set in the WBMP +string. All other pixels will be considered "background".

    + + + +

    Color manipulation methods

    + + +

    gdImage:colorAllocate(red, green, blue)

    + +

    colorAllocate() finds the first available color +index in the image specified, sets its RGB values to those requested +(255 is the maximum for each), and returns the index of the new color +table entry, or an RGBA value in the case of a truecolor image; in +either case you can then use the returned value as a parameter to +drawing methods. When creating a new palette-based image, the first +time you invoke this method, you are setting the background color for +that image.

    + +

    In the event that all gd.MAX_COLORS colors (256) +have already been allocated, colorAllocate will +return nil to indicate failure. (This is not uncommon when working +with existing PNG files that already use 256 colors). Note that +colorAllocate does not check for existing colors that match +your request; see colorExact, colorClosest +and colorClosestHWB for ways to locate existing colors +that approximate the color desired in situations where a new color is +not available.

    + + +

    gdImage:colorAllocateAlpha(red, green, blue, alpha)

    + +

    colorAllocateAlpha finds the first available color index +in the image specified, sets its RGBA values to those requested (255 is +the maximum for red, green and blue, and 127 represents full transparency +for alpha), and returns the index of the new color table entry, or an RGBA +value in the case of a truecolor image; in either case you can then use +the returned value as a parameter to drawing methods. When creating +a new palette-based image, the first time you invoke this method, +you are setting the background color for that image.

    + +

    In the event that all gd.MAX_COLORS colors (256) have +already been allocated, colorAllocateAlpha will return +nil to indicate failure. (This is not uncommon when working with +existing palette-based PNG files that already use 256 colors). Note +that colorAllocateAlpha does not check for existing +colors that match your request; see colorExactAlpha and +colorClosestAlpha for ways to locate existing colors that +approximate the color desired in situations where a new color is not +available. Also see colorResolveAlpha.

    + + + +

    gdImage:colorClosest(red, green, blue)

    + +

    colorClosest searches the colors which have been defined +thus far in the image specified and returns the index of the color with +RGB values closest to those of the request. (Closeness is determined +by Euclidian distance, which is used to determine the distance in +three-dimensional color space between colors).

    + +

    If no colors have yet been allocated in the image, +colorClosest returns nil.

    + +

    When applied to a truecolor image, this method always succeeds in +returning the desired color.

    + +

    This method is most useful as a backup method for choosing a +drawing color when an image already contains gd.MAX_COLORS +(256) colors and no more can be allocated. (This is not uncommon when +working with existing PNG files that already use many colors). See +colorExact for a method of locating exact matches only.

    + + +

    gdImage:colorClosestAlpha(red, green, blue, alpha)

    + +

    colorClosestAlpha searches the colors which have been +defined thus far in the image specified and returns the index of the +color with RGBA values closest to those of the request. (Closeness is +determined by Euclidian distance, which is used to determine the distance +in four-dimensional color/alpha space between colors).

    + +

    If no colors have yet been allocated in the image, +colorClosestAlpha returns nil.

    + +

    When applied to a truecolor image, this method always succeeds in +returning the desired color.

    + +

    This method is most useful as a backup method for +choosing a drawing color when a palette-based image already +contains gd.MAX_COLORS (256) colors and no more can be +allocated. (This is not uncommon when working with existing palette-based +PNG files that already use many colors). See colorExactAlpha +for a method of locating exact matches only.

    + + +

    gdImage:colorClosestHWB(red, green, blue)

    + +

    colorClosestHWB searches the colors which have been +defined thus far in the image specified and returns the index of the color +with hue, whiteness and blackness closest to the requested color. This +scheme is typically superior to the Euclidian distance scheme used by +colorClosest.

    + +

    If no colors have yet been allocated in the image, +colorClosestHWB returns nil.

    + +

    When applied to a truecolor image, this method always succeeds in +returning the desired color.

    + +

    This method is most useful as a backup method for choosing a +drawing color when an image already contains gd.MAX_COLORS +(256) colors and no more can be allocated. (This is not uncommon when +working with existing PNG files that already use many colors). See +colorExact for a method of locating exact matches only.

    + + +

    gdImage:colorExact(red, green, blue)

    + +

    colorExact searches the colors which have been defined +thus far in the image specified and returns the index of the first +color with RGB values which exactly match those of the request. If no +allocated color matches the request precisely, colorExact +returns nil. See colorClosest for a way to find the +color closest to the color requested.

    + +

    When applied to a truecolor image, this method always succeeds in +returning the desired color.

    + + +

    gdImage:colorExactAlpha(red, green, blue, alpha)

    + +

    colorExactAlpha searches the colors which have +been defined thus far in the image specified and returns the +index of the first color with RGBA values which exactly match +those of the request. If no allocated color matches the request +precisely, colorExactAlpha returns nil. See +colorClosestAlpha for a way to find the color closest to +the color requested.

    + +

    When applied to a truecolor image, this method always succeeds in +returning the desired color.

    + +

    gdImage:colorResolve(red, green, blue)

    + +

    colorResolve searches the colors which have been defined +thus far in the image specified and returns the index of the first color +with RGB values which exactly match those of the request. If no allocated +color matches the request precisely, then colorResolve +tries to allocate the exact color. If there is no space left in +the color table then ColorResolve returns the closest color (as in +colorClosest). This method always returns an index of a +color.

    + +

    When applied to a truecolor image, this method always succeeds in +returning the desired color.

    + + +

    gdImage:colorResolveAlpha(red, green, blue, alpha)

    + +

    colorResolveAlpha searches the colors which have +been defined thus far in the image specified and returns the index +of the first color with RGBA values which exactly match those of the +request. If no allocated color matches the request precisely, then +colorResolveAlpha tries to allocate the exact color. If there +is no space left in the color table then colorResolveAlpha +returns the closest color (as in colorClosestAlpha). This +method always returns an index of a color.

    + +

    When applied to a truecolor image, this method always succeeds in +returning the desired color.

    + + +

    gdImage:colorsTotal()

    +

    This method returns the number of colors currently allocated in a +palette image. For truecolor images, the result of this call is undefined +and should not be used.

    + + +

    gdImage:red(color)

    +

    This method returns the red portion of the specified color in the +image. This method works for both palette and truecolor images.

    + + +

    gdImage:blue(color)

    +

    This method returns the blue portion of the specified color in the +image. This method works for both palette and truecolor images.

    + + +

    gdImage:green(color)

    +

    This method returns the green portion of the specified color in the +image. This method works for both palette and truecolor images.

    + + +

    gdImage:alpha(color)

    + +

    This method returns the alpha portion of the specified color in the +image. This method works for both palette and truecolor images.

    + + +

    gdImage:getTransparent()

    +

    This method returns the current transparent color index in +the image. If there is no transparent color, getTransparent +returns nil.

    + + +

    gdImage:colorTransparent(color)

    + +

    colorTransparent sets the transparent color index for +the specified image to the specified index. To indicate that there +should be no transparent color, invoke colorTransparent +with a color index of nil (or passing no color index). Note that +JPEG images do not support transparency, so this setting has no effect +when writing JPEG images.

    + +

    The color index used should be an index allocated by +colorAllocate, whether explicitly invoked by your code or +implicitly invoked by loading an image. In order to ensure that your +image has a reasonable appearance when viewed by users who do not +have transparent background capabilities (or when you are writing a +JPEG-format file, which does not support transparency), be sure to give +reasonable RGB values to the color you allocate for use as a transparent +color, even though it will be transparent on systems that support PNG +transparency.

    + + +

    gdImage:colorDeallocate(color)

    + +

    colorDeallocate marks the specified color as being +available for reuse. It does not attempt to determine whether the +color index is still in use in the image. After a call to this +method, the next call to colorAllocate for the same +image will set new RGB values for that color index, changing the color +of any pixels which have that index as a result. If multiple calls to +colorDeallocate are made consecutively, the lowest-numbered +index among them will be reused by the next colorAllocate +call.

    + + +

    Query methods

    + +

    gdImage:boundsSafe(x, y)

    + +

    boundsSafe returns true if the specified point +is within the current clipping rectangle, false if not. The +clipping rectangle is set by setClip and defaults to the +entire image. This method is intended primarily for use by those who +wish to add methods to Lua-GD. All of the drawing functions already +clip safely.

    + + +

    gdImage:getPixel(x, y)

    +

    getPixel returns the color index of a particular pixel.

    + +

    gdImage:sizeX()

    +

    sizeX returns the width of the image in pixels.

    + + +

    gdImage:sizeY()

    +

    sizeY returns the height of the image in pixels.

    + + +

    gdImage:sizeXY()

    +

    sizeXY returns the width and the height of the image +in pixels. This method has no C equivalent because, unlike Lua, +C functions cannot return multiple values.

    + +

    Example:

    +
    +local x, y = im:sizeXY()
    +
    + + + +

    gdImage:getClip()

    +

    Fetches the boundaries of the current clipping rectangle. This method +returns four numbers.

    + +

    Example:

    +
    +local x1, y1, x2, y2 = im:getClip()
    +
    + + + +

    gdImage:setClip(x1, y1, x2, y2)

    + +

    Establishes a clipping rectangle. Once setClip has been +called, all future drawing operations will remain within the specified +clipping area, until a new setClip call takes place. For +instance, if a clipping rectangle of 25, 25, 75, 75 has been set within +a 100x100 image, a diagonal line from 0,0 to 99,99 will appear only +between 25,25 and 75,75.

    + + +

    Drawing methods

    + +

    gdImage:setPixel(x, y, color)

    +

    setPixel sets a pixel to a particular color index.

    + +

    gdImage:line(x1, y1, x2, y2, color)

    + +

    line is used to draw a line between two endpoints +(x1, y1) and (x2, y2). The line is drawn using the color index +specified. Note that the color index can be an actual color returned +by colorAllocate or one of gd.STYLED, +gd.BRUSHED or gd.STYLED_BRUSHED.

    + + +

    gdImage:rectangle(x1, y1, x2, y2, color)

    + +

    rectangle is used to draw a rectangle with the two +corners (upper left first, then lower right) specified, using the color +index specified.

    + + +

    gdImage:filledRectangle(x1, y1, x2, y2, color)

    + +

    filledRectangle is used to draw a rectangle with the +two corners (upper left first, then lower right) specified, filled using +the color index specified.

    + + +

    gdImage:polygon({ { x1, y1 }, { x2, y2 } ... }, color)

    + +

    polygon is used to draw a polygon with the verticies +(at least 3) specified in the table, using the color index specified.

    + +

    Example:

    +
    +im = assert(gd.createTrueColor(80, 80))
    +black = im:colorAllocate(0, 0, 0)
    +white = im:colorAllocate(255, 255, 255)
    +im:polygon( { { 10, 10 }, { 10, 20 }, { 20, 20 }, { 20, 10 } }, white)
    +im:png("out.png")
    +
    + + + + +

    gdImage:filledPolygon({ { x1, y1 }, { x2, y2 } ... }, color)

    + +

    polygon is used to fill a polygon with the verticies +(at least 3) specified in the table, using the color index specified.

    + +

    Example:

    +
    +im = assert(gd.createTrueColor(80, 80))
    +black = im:colorAllocate(0, 0, 0)
    +white = im:colorAllocate(255, 255, 255)
    +im:filledPolygon( { { 30, 30 }, { 30, 40 }, { 40, 40 }, { 40, 30 } }, white)
    +im:png("out.png")
    +
    + + + + + +

    gdImage:openPolygon({ { x1, y1 }, { x2, y2 } ... }, color)

    + +

    openPolygon is used to draw a sequence of lines with the +verticies (at least 3) specified, using the color index specified. Unlike +polygon, the enpoints of the line sequence are not connected to +a closed polygon.

    + +

    Example:

    +
    +im = assert(gd.createTrueColor(80, 80))
    +black = im:colorAllocate(0, 0, 0)
    +white = im:colorAllocate(255, 255, 255)
    +im:openPolygon( { { 50, 50 }, { 50, 60 }, { 60, 60 }, { 60, 50 } }, white)
    +im:png("out.png")
    +
    + + + + +

    gdImage:arc(cx, cy, w, h, s, e, color)

    + +

    arc is used to draw a partial ellipse centered at the +given point, with the specified width and height in pixels. The arc +begins at the position in degrees specified by s and ends at the +position specified by e . The arc is drawn in the color specified +by the last argument. A circle can be drawn by beginning from 0 degrees +and ending at 360 degrees, with width and height being equal. e +must be greater than s. Values greater than 360 are interpreted +modulo 360.

    + + +

    gdImage:filledArc(cx, cy, w, h, s, e, color, style)

    + +

    filledArc is used to draw a partial ellipse centered at +the given point, with the specified width and height in pixels. The arc +begins at the position in degrees specified by s and ends at the +position specified by e. The arc is filled in the color specified +by color. A circle can be drawn by beginning from 0 degrees +and ending at 360 degrees, with width and height being equal. e +must be greater than s. Values greater than 360 are interpreted +modulo 360. The last argument is a sum of the following possibilities: +gd.ARC, gd.CHORD, gd.PIE +(synonym for gd.CHORD), gd.NO_FILL and +gd.EDGED. gd.ARC and gd.CHORD are +mutually exclusive; gd.CHORD just connects the starting +and ending angles with a straight line, while gd.ARC +produces a rounded edge. gd.PIE is a synonym for +gd.ARC. gd.NO_FILL indicates that the arc +or chord should be outlined, not filled. gd.EDGED, used +together with gd.NO_FILL, indicates that the beginning and +ending angles should be connected to the center; this is a good way to +outline (rather than fill) a 'pie slice'.

    + + +

    gdImage:filledEllipse(cx, cy, w, h, color)

    + +

    filledEllipse is used to draw an ellipse centered at the +given point, with the specified width and height in pixels. The ellipse +is filled in the color specified by the last argument.

    + + +

    gdImage:fill(x, y, c)

    + +

    fill floods a portion of the image with the specified +color, beginning at the specified point and flooding the surrounding +region of the same color as the starting point. For a way of flooding +a region defined by a specific border color rather than by its interior +color, see fillToBorder.

    + +

    The fill color can be gd.TILED, resulting in a tile +fill using another image as the tile. However, the tile image cannot be +transparent. If the image you wish to fill with has a transparent color +index, call setTransparent on the tile image and set the +transparent color index to nil to turn off its transparency.

    + +

    gdImage:fillToBorder(x, y, border_color, color)

    + +

    fillToBorder floods a portion of the image with the +specified color, beginning at the specified point and stopping at the +specified border color. For a way of flooding an area defined by the +color of the starting point, see fill.

    + +

    The border color cannot be a special color such as +gd.TILED; it must be a proper solid color. The fill color +can be, however.

    + + +

    gdImage:saveAlpha(boolean)

    + +

    By default, gd does not saves the alpha channel on a PNG image, an option +that saves some space in the output file. To enable this, just call up this +method passing true as the sole paremeter.

    + + +

    gdImage:alphaBlending(boolean)

    + +

    This method allows for two different modes of drawing on truecolor images. +In blending mode, the alpha channel component of the color supplied to all +drawing methods determines how much of the underlying color should be allowed +to shine through. As a result, Lua-GD automatically blends the existing color +at that point with the drawing color, and stores the result in the image, +resulting in a opaque pixel. In non-blending mode, the drawing color is +copied with its alpha channel information, replacing the destination pixel. +Blending mode is not available when drawing on palette images.

    + + +

    Text drawing methods

    + +

    gdImage:string(font, x, y, string, color)

    + +

    This method draws the string in the fourth argument on the image +using one of the standard gd fonts (gd.FONT_TINY, +gd.FONT_SMALL, gd.FONT_MEDIUM, +gd.FONT_LARGE or gd.FONT_GIANT) from left +to right, starting from the (x, y) point and with the color specified +by the fifth argument. The string must have only ISO-8859-1 characters +(you should use gd.stringFT and True Type fonts for drawing +Unicode strings.

    + +

    Example:

    +
    +im = gd.create(140, 80)
    +white = im:colorAllocate(255, 255, 255)
    +black = im:colorAllocate(0, 0, 0)
    +im:string(gd.FONT_TINY, 10, 20, "TINY", black)
    +im:string(gd.FONT_SMALL, 10, 30, "SMALL", black)
    +im:string(gd.FONT_MEDIUM, 10, 45, "MEDIUM", black)
    +im:string(gd.FONT_LARGE, 10, 58, "LARGE", black)
    +im:string(gd.FONT_GIANT, 10, 75, "GIANT", black)
    +im:png("out.png")
    +
    + + +

    gdImage:stringUp(fontname, x, y, string, color)

    + +

    Similar to gd.string but the string will be drawn +vertically (rotated 90 degrees), from bottom to up, starting from the +(x, y) point. The string must have only ISO-8859-1 characters. If you +want use Unicode characters or other rotations than 90°, you should +use gd.stringFT and True Type fonts.

    + +

    gdImage:stringFT(color, fontname, ptsize, angle, x, y, string)

    + +

    stringFT draws a string of anti-aliased characters on the +image using the FreeType library to render user-supplied TrueType fonts. +The string is anti-aliased, meaning that there should be fewer "jaggies" +visible. The fontname is the full pathname to a TrueType font file, +or a font face name if the GDFONTPATH environment variable +have been set intelligently. In the absence of a full path, the font face +name may be presented with or without extension. Font names can also be +fontconfig +patterns (see gd.useFontConfig) so, the library will +automatically use fonts from your operating system.

    + +

    The string argument is considered to be encoded via the UTF-8 +standard; also, HTML entities are supported, including decimal, +hexadecimal, and named entities. Those who are passing ordinary +ASCII strings may have difficulty with the & character unless +encoded correctly as &amp; but should have no other +difficulties.

    + +

    The string may be arbitrarily scaled (ptsize) and rotated (angle in +radians). The direction of rotation is counter-clockwise, with 0 radians +(0 degrees) at 3 o'clock and PI/2 radians (90 degrees) at 12 o'clock +(you should use math.rad to convert degrees to radians). +The string is rendered in the color indicated by the color index. Use +the negative of the desired color index to disable anti-aliasing.

    + +

    This method return eight values with the limits of the rendered +text on sucess or nil on failure. The following code show how to +use them to draw a bounding rectangle arround the text.

    + +
    +im = gd.createTrueColor(100, 100)
    +black = im:colorAllocate(0, 0, 0)
    +white = im:colorAllocate(255, 255, 255)
    +blue  = im:colorAllocate(0, 0, 240)
    +im:filledRectangle(0, 0, 100, 100, black)
    +llx, lly, lrx, lry, urx, ury, ulx, uly = im:stringFT(white, "Vera.ttf", 20, math.rad(45), 20, 90, "Lua-GD")
    +im:polygon({ {llx, lly}, {lrx, lry}, {urx, ury}, {ulx, uly} }, blue)
    +
    + +

    Variables used above can be translated as follows. The points are relative +to the text regardless of the angle, so "upper left" means in the top +left-hand corner seeing the text horizontally.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    # Name Meaning
    1 llx lower left corner, X position
    2 lly lower left corner, Y position
    3 lrx lower right corner, X position
    4 lry lower right corner, Y position
    5 urx upper right corner, X position
    6 ury upper right corner, Y position
    7 ulx upper left corner, X position
    8 uly upper left corner, Y position
    + +

    Also, there is a way to get these values before drawing on the image +passing nil as the first argument of gd.stringFT (note +the absence of the colon notation!), as follows. This is a relatively +cheap operation if followed by a rendering of the same string, because +of the caching of the partial rendering during bounding rectangle +calculation.

    + +
    +llx, lly, lrx, lry, urx, ury, ulx, uly = gd.stringFT(nil, white, "Vera.ttf", 20, math.rad(45), 20, 90, "Lua-GD")
    +
    + + + +

    gdImage:stringFTEx(color, fontname, ptsize, angle, x, y, string, extra)

    + +

    This is an extended version of stringFT that accepts +a table as an extra argument, which allows you to pass some +parameters to the rendering engine. The fields currently available are +show bellow:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field name Type Default Usage
    linespacing float 1.05 Allows you to set the space between lines when rendering multiple + lines. A line spacing of 1.0 is the minimum to guarantee that lines + of text do not collide.
    charmap indexed gd.FTEX_Unicode Allows you to set a specific character encoding schema, which can + be any of gd.FTEX_Unicode, + gd.FTEX_Shift_JIS, or gd.FTEX_Big5. It is + useful when a font offers more than one of Unicode, Shift_JIS, and + Big5. If you do not specify one, Unicode will be tried first. If + the preferred character mapping is not found in the font, other + character mappings are attempted.
    hdpi integer 96 Sets the horizontal resolution passed to the FreeType engine.
    vdpi integer 96 Sets the vertical resolution passed to the FreeType engine.
    disable_kerning boolean false If fontconfig is available, gd will normally attempt to apply + kerning tables to adjust the relative positions of consecutive + characters more ideally for that pair of characters. This field + allows you to turn this feature off.
    xshow boolean false Request gd to return a vector of individual character position + advances, occasionally useful in applications that must know exactly + where each character begins. This is returned as a string with values + separated by spaces.
    return_font_path_name boolean false Returns the path to the font used to render the text. This is + useful because gd are capable of selecting a font automatically + based on a fontconfig font pattern when fontconfig is available.
    fontconfig boolean false gd can use fontconfig to resolve font names, including fontconfig + patterns, if this field is set to true. As a convenience, + this behavior can also be made the default by calling + gd.useFontConfig with a true value.
    + +

    This method also returns the same values than stringFT, +more two aditional ones if the fields xshow or +return_font_path_name are set to true. See the following +example:

    + +
    +llX, llY, lrX, lrY, urX, urY, ulX, ulY = 
    +  im:stringFTEx(blue, "Vera", 20, 0, 50, 50, "Lua-GD",
    +    { hdpi = 40, vdpi = 20 } )
    +
    +llX, llY, lrX, lrY, urX, urY, ulX, ulY, pos = 
    +  im:stringFTEx(blue, "Vera", 20, 0, 50, 150, "Lua-GD",
    +    { hdpi = 40, vdpi = 20, xshow = true } )
    +
    +llX, llY, lrX, lrY, urX, urY, ulX, ulY, fontpath = 
    +  im:stringFTEx(blue, "Vera", 20, 0, 50, 250, "Lua-GD",
    +    { hdpi = 40, vdpi = 20, return_font_path_name = true } )
    +
    +llX, llY, lrX, lrY, urX, urY, ulX, ulY, pos, fontpath = 
    +  im:stringFTEx(blue, "Vera", 20, 0, 50, 350, "Lua-GD",
    +    { hdpi = 40, vdpi = 20, xshow = true, return_font_path_name = true } )
    +
    + + + + +

    gdImage:stringFTCircle(cx, cy, radius, textRadius, fillPortion, fontname, points, top, bottom, color)

    + +

    Draws the text strings specified by top and bottom on +the image, curved along the edge of a circle of radius radius, +with its center at cx and cy. top is written +clockwise along the top; bottom is written counterclockwise along +the bottom. textRadius determines the "height" of each character; +if textRadius is 1/2 of radius, characters extend halfway +from the edge to the center. fillPortion varies from 0 to 1.0, +with useful values from about 0.4 to 0.9, and determines how much of the +180 degrees of arc assigned to each section of text is actually occupied +by text; 0.9 looks better than 1.0 which is rather crowded. fontname +is a freetype font; see gd.stringFT. points is +passed to the freetype engine and has an effect on hinting; although +the size of the text is determined by radius, textRadius, +and fillPortion, you should pass a point size that "hints" +appropriately -- if you know the text will be large, pass a large point +size such as 24.0 to get the best results. color can be any color, +and may have an alpha component, do blending, etc.

    + + +

    Font configuration methods

    + +

    gd.useFontConfig(bool)

    +

    gd has the ability to use +fontconfig +patterns rather than font file names as parameters to +gd.stringFT and gd.stringFTCircle. For +backwards compatibility reasons, the fontlist parameter to those +functions is still expected to be a full or partial font file path +name or list thereof by default. However, as a convenience, a single +call to gd.useFontConfig with a true parameter +configures Lua-GD to expect the fontlist parameter to be a fontconfig +pattern. Otherwise, calling gd.useFontConfig with a +false parameter will disable the fontconfig patters.

    + + +

    gd.fontCacheSetup()

    + +

    This function initializes the font cache for freetype text +output functions such as gd.stringFT. If this function +is not called by the programmer, it is invoked automatically on the +first truetype text output call, which is perfectly safe unless the +application is multithreaded (either using LuaThreads or running Lua from +a different thread in your host program which also uses gd from the C API) +. Multithreaded applications should directly invoke this function before +allowing any thread to use freetype text output. You don't need to call +this functions if you are using Lua coroutines because any calls from +Lua to C API ara atomic. This function returns true on success +or false if the freetype library fails to initialize.

    + + +

    gd.fontCacheShutdown()

    + +

    This function releases the memory used by the freetype font cache +and the text output mutex. Applications that use Lua-GD for their entire +lifetime, then exit, need not call this function. This function has no +return value.

    + + + +

    Image copying, resizing and transformation methods

    + + +

    gd.copy(dstImage, srcImage, dstX, dstY, srcX, srcY, w, h)
    +dstImage:copy(srcImage, dstX, dstY, srcX, srcY, w, h)

    + +

    gd.copy is used to copy a rectangular portion of one +image to another image (For a way of stretching or shrinking the image +in the process, see gd.copyResized).

    + +

    The dstImage argument is the destination image to which +the region will be copied (you can use the colon notation for it). The +srcImage argument is the source image from which the region is +copied. The dstX and dstY arguments specify the point in +the destination image to which the region will be copied. The srcX +and srcY arguments specify the upper left corner of the region +in the source image. The w and h arguments specify the +width and height of the region.

    + +

    When you copy a region from one location in an image to another +location in the same image, gd.copy will perform as +expected unless the regions overlap, in which case the result is +unpredictable.

    + +

    Important note on copying between images: since different +images do not necessarily have the same color tables, pixels are +not simply set to the same color index values to copy them. If the +destination image is a palette image, this method will use the +gd.colorResolve method to determine the best color +available.

    + + + +

    gd.copyResized(dstImage, srcImage, dstX, dstY, srcX, srcY, dstW, dstH, srcW, srcH)
    +dstImage:copyResized(srcImage, dstX, dstY, srcX, srcY, dstW, dstH, srcW, srcH)

    + + +

    gd.copyResized is used to copy a rectangular portion of +one image to another image. The X and Y dimensions of the original region +and the destination region may vary, resulting in stretching or shrinking +of the region as appropriate (For a simpler version of this method +which does not deal with resizing, see gd.copy).

    + +

    The dstImage argument is the destination image to which the +region will be copied. The srcImage argument is the source +image from which the region is copied. The dstX and dstY +arguments specify the point in the destination image to which the region +will be copied. The srcX and srcY arguments specify the +upper left corner of the region in the source image. The dstW +and dstH arguments specify the width and height of the destination +region. The srcW and srcH arguments specify the width and +height of the source region and can differ from the destination size, +allowing a region to be scaled during the copying process.

    + +

    When you copy a region from one location in an image to another +location in the same image, gd.copyResized will perform +as expected unless the regions overlap, in which case the result is +unpredictable.

    + +

    Important note on copying between images: since different +images do not necessarily have the same color tables, pixels are +not simply set to the same color index values to copy them. If the +destination image is a palette image, this method will use the +gd.colorResolve method to determine the best color +available.

    + + + + +

    gd.copyResampled(dstImage, srcImage, dstX, dstY, srcX, srcY, dstW, dstH, srcW, srcH)
    +dstImage:copyResampled(srcImage, dstX, dstY, srcX, srcY, dstW, dstH, srcW, srcH)

    + +

    gd.copyResampled is used to copy a rectangular portion +of one image to another image, smoothly interpolating pixel values so +that, in particular, reducing the size of an image still retains a great +deal of clarity. The X and Y dimensions of the original region and the +destination region can vary, resulting in stretching or shrinking of the +region as appropriate. (For a simpler version of this method which does +not deal with resizing, see gd.copy. For a version which +does not interpolate pixel values, see gd.copyResized).

    + +

    Pixel values are only interpolated if the destination image is a +truecolor image. Otherwise, gd.copyResized is automatically +invoked.

    + +

    The dstImage argument is the destination image to which +the region will be copied. The srcImage argument is the source +image from which the region is copied. The dstX and dstY +arguments specify the point in the destination image to which the region +will be copied. The srcX and srcY arguments specify the +upper left corner of the region in the source image. The dstW +and dstH arguments specify the width and height of the destination +region. The srcW and srcH arguments specify the width and +height of the source region and can differ from the destination size, +allowing a region to be scaled during the copying process.

    + +

    When you copy a region from one location in an image to another +location in the same image, gd.copyResampled will perform +as expected unless the regions overlap, in which case the result is +unpredictable. If this presents a problem, create a scratch image +in which to keep intermediate results.

    + +

    Important note on copying between images: since different +images do not necessarily have the same color tables, pixels are +not simply set to the same color index values to copy them. If the +destination image is a palette image, this method will use the +gd.colorResolve method to determine the best color +available.

    + + + + +

    gd.copyRotated(dstImage, srcImage, dstX, dstY, srcX, srcY, srcW, srcH, ang)
    +dstImage:copyRotated(srcImage, dstX, dstY, srcX, srcY, srcW, srcH, ang)

    + +

    gd.copyRotated is used to copy a rectangular portion of +one image to another image, or to another region of the same image. The +srcX and srcY coordinates specify the upper left corner of +the source area; however, the dstX and dstY coordinates +specify the center of the destination area. This important +distinction is made because the rotated rectangle may may or may not be +parallel to the X and Y axes. The destination coordinates may be floating +point, as the center of the desired destination area may lie at the +center of a pixel (0.5 pixels) rather than its upper left corner. The +angle specified is an integer number of degrees, between 0 and 360, +with 0 degrees causing no change, and counterclockwise rotation as the +angle increases.

    + +

    When you copy a region from one location in an image to another +location in the same image, gd.copyRotated will perform +as expected unless the regions overlap, in which case the result is +unpredictable. If this presents a problem, create a scratch image +in which to keep intermediate results.

    + +

    Important note on copying between images: since different +images do not necessarily have the same color tables, pixels are +not simply set to the same color index values to copy them. If the +destination image is a palette image, this method will use the +gd.colorRotated method to determine the best color +available.

    + + + +

    gd.copyMerge(dstImage, srcImage, dstX, dstY, srcX, srcY, w, h, pct)
    +dstImage:copyMerge(srcImage, dstX, dstY, srcX, srcY, w, h, pct)

    + +

    gd.copyMerge is almost identical to gd.copy, +except that it 'merges' the two images by an amount specified in the +last parameter. If the last parameter is 100, then it will method +identically to gd.copy - the source image replaces the +pixels in the destination.

    + +

    If, however, the pct parameter is less than 100, then the two images +are merged. With pct = 0, no action is taken.

    + +

    This feature is most useful to 'highlight' sections of an image by +merging a solid color with pct = 50.

    + + + +

    gd.copyMergeGray(dstImage, srcImage, dstX, dstY, srcX, srcY, w, h, pct)
    +dstImage:copyMergeGray(srcImage, dstX, dstY, srcX, srcY, w, h, pct)

    + +

    gd.copyMergeGray is almost identical to +gd.copyMerge, except that when merging images it preserves +the hue of the source by converting the destination pixels to grey scale +before the copy operation.

    + + + +

    gd.paletteCopy(dstImage, srcImage)
    +dstImage:paletteCopy(srcImage)

    + +

    gd.paletteCopy copies a palette from one image to another, +attempting to match the colors in the target image to the colors in the +source palette.

    + + + +

    gdImage:squareToCircle(radius)

    + +

    Returns a new image of width and height radius * 2, in which the X +axis of the original has been remapped to theta (angle) and the +Y axis of the original has been remapped to rho (distance from +center). This is known as a "polar coordinate transform". The image +must be square, but can have any size.

    + + + +

    gdImage:sharpen(pct)

    + +

    Sharpens the specified image. pct is a sharpening percentage, +and can be greater than 100. Silently does nothing to non-truecolor +images. Silently does nothing for pct < 0. Transparency/alpha +channel are not altered.

    + + + +

    gdImage:trueColorToPalette(dither, colorsWanted)

    + +

    This method converts a truecolor image to a palette-based image, +using a high-quality two-pass quantization routine. If dither +is set to true, the image will be dithered to approximate colors +better, at the expense of some obvious "speckling". colorsWanted, +an integer value, can be anything up to 256. If the original source image +includes photographic information or anything that came out of a JPEG, +256 is strongly recommended. 100% transparency of a single transparent +color in the original truecolor image will be preserved. There is no +other support for preservation of alpha channel or transparency in the +destination image.

    + +

    For best results, don't use this method -- write real truecolor +PNGs and JPEGs. The disk space gain of conversion to palette is not great +(for small images it can be negative) and the quality loss is ugly.

    + + + + +

    GIF animation methods

    + +

    gdImage:gifAnimBegin(filename, globalCM, loops)

    + +

    This method must be called as the first method when creating a GIF +animation in a file on the disk. It writes the correct GIF file headers +to file name filename and prepares for frames to be added for +the animation. The image argument is not used to produce an image frame +to the file, it is only used to establish the GIF animation frame size, +interlacing options and the color palette. gd.gifAnimAdd +is used to add the first and subsequent frames to the animation, and +the animation must be terminated by calling gd.gifAnimEnd, +passing the same file name.

    + +

    The globalCM flag indicates if a global color map (or palette) +is used in the GIF89A header. A true value specifies that a +global color map should be used to reduce the size of the animation. Of +course, if the color maps of individual frames differ greatly, a global +color map may not be a good idea, so you should use globalCM = +false.

    + +

    If loops is 0 or greater, the Netscape 2.0 extension for +animation loop count is written. 0 means infinite loop count. -1 means +that the extension is not added which results in no looping. -1 is +the default.

    + + + +

    gdImage:gifAnimBeginStr(globalCM, loops)

    + +

    This method must be called as the first method when creating a GIF +animation in memory. It returns the correct GIF file headers as an Lua +string and prepares for frames to be added for the animation. The image +argument is not used to produce an image frame to the file, it is only +used to establish the GIF animation frame size, interlacing options +and the color palette. New frames must be created with the method +gd.gifAnimAddStr and concatened to this one. Finally, +one last frame, generated with the method gd.gifAnimEndStr, +must be concatened to finish the animation.

    + +

    The globalCM flag indicates if a global color map (or palette) +is used in the GIF89A header. A true value specifies that a +global color map should be used to reduce the size of the animation. Of +course, if the color maps of individual frames differ greatly, a global +color map may not be a good idea, so you should use globalCM = +false.

    + +

    If loops is 0 or greater, the Netscape 2.0 extension for +animation loop count is written. 0 means infinite loop count. -1 means +that the extension is not added which results in no looping. -1 is +the default.

    + + + +

    gdImage:gifAnimAdd(filename, localCM, leftOfs, topOfs, delay, disposal [, previm])

    + +

    This method writes GIF animation frames to the file specified by +filename, which was created with gd.gifAnimBegin. With +leftOfs and topOfs you can place this frame in +different offset than (0, 0) inside the image screen as defined +in gd.gifAnimBegin. Delay between the previous +frame and this frame is in 1/100s units. Disposal is usually +gd.DISPOSAL_NONE, meaning that the pixels changed by this +frame should remain on the display when the next frame begins to render, +but can also be gd.DISPOSAL_UNKNOWN (not recommended), +gd.DISPOSAL_RESTORE_BACKGROUND (restores the first allocated +color of the global palette), or gd.DISPOSAL_RESTORE_PREVIOUS +(restores the appearance of the affected area before the frame was +rendered). Only gd.DISPOSAL_NONE is a sensible choice for the +first frame. If previm is passed, the built-in GIF optimizer will +always use gd.DISPOSAL_NONE regardless of the disposal +parameter.

    + +

    Setting the localCM flag to true adds a local +palette for this image to the animation. Otherwise the global palette +is assumed and the user must make sure the palettes match. Use +gd.paletteCopy to do that.

    + +

    Automatic optimization is activated by giving the previous +image as a parameter. This method then compares the images and +only writes the changed pixels to the new frame in animation. The +disposal parameter for optimized animations must be set to +gd.DISPOSAL_NONE, also for the first frame. leftOfs +and topOfs parameters are ignored for optimized frames. To achieve +good optimization, it is usually best to use a single global color map. To +allow gd.gifAnimAdd to compress unchanged pixels via the use +of a transparent color, the image must include a transparent color.

    + + + + +

    gdImage:gifAnimAddStr(localCM, leftOfs, topOfs, delay, disposal [, previm])

    + +

    This method returns GIF animation frames as Lua +strings to be concatenated to headers which was created with +gd.gifAnimBeginStr. With leftOfs and topOfs +you can place this frame in different offset than (0, 0) inside the image +screen as defined in gd.gifAnimBegin. Delay between the +previous frame and this frame is in 1/100s units. Disposal is usually +gd.DISPOSAL_NONE, meaning that the pixels changed by this +frame should remain on the display when the next frame begins to render, +but can also be gd.DISPOSAL_UNKNOWN (not recommended), +gd.DISPOSAL_RESTORE_BACKGROUND (restores the first allocated +color of the global palette), or gd.DISPOSAL_RESTORE_PREVIOUS +(restores the appearance of the affected area before the frame was +rendered). Only gd.DISPOSAL_NONE is a sensible choice for the +first frame. If previm is passed, the built-in GIF optimizer will +always use gd.DISPOSAL_NONE regardless of the disposal +parameter.

    + +

    Setting the localCM flag to true adds a local +palette for this image to the animation. Otherwise the global palette +is assumed and the user must make sure the palettes match. Use +gd.paletteCopy to do that.

    + +

    Automatic optimization is activated by giving the previous +image as a parameter. This method then compares the images and +only writes the changed pixels to the new frame in animation. The +disposal parameter for optimized animations must be set to +gd.DISPOSAL_NONE, also for the first frame. leftOfs +and topOfs parameters are ignored for optimized frames. To achieve +good optimization, it is usually best to use a single global color map. To +allow gd.gifAnimAdd to compress unchanged pixels via the use +of a transparent color, the image must include a transparent color.

    + + +

    gdImage:gifAnimEnd(filename)

    + +

    Finishes a GIF animation properly by writing a semicolon character +(;) to the output file. You must call this method (or write the semicolon +by yourself) to create valid animations.

    + + + +

    gdImage:gifAnimEndStr()

    + +

    Returns a semicolon character (;) as a Lua string, which must +be concatened as the last element of an animation created with +gd.gifAnimBeginStr and gd.gifAnimAddStr. Of +course, you can concatenate a semicolon by yourself, but this is a more +explicit way to finish the animation.

    + + + + +

    Examples

    + + +

    CGI Web Counter

    +
    +#!/usr/bin/env lua
    +-- counter.lua -- a web counter in Lua!
    +-- (c) 2004 Alexandre Erwin Ittner
    +
    +local gc = require("gd")
    +
    +datafile = "counter.txt"
    +fp = io.open(datafile, "r+")
    +if fp then
    +  cnt = tonumber(fp:read("*l")) or 0
    +  fp:seek("set", 0)
    +else
    +  cnt = 0
    +  fp = io.open(datafile, "w")
    +  assert(fp)
    +end
    +cnt = cnt + 1
    +fp:write(cnt .."\n")
    +fp:close()
    +
    +sx = math.max(string.len(tostring(cnt)), 1) * 8
    +im = gd.create(sx, 15)
    +-- first allocated color defines the background.
    +white = im:colorAllocate(255, 255, 255)
    +im:colorTransparent(white)
    +black = im:colorAllocate(0, 0, 0)
    +im:string(gd.FONT_MEDIUM, 1, 1, cnt, black)
    +
    +print("Content-type: image/png\n")
    +io.write(im:pngStr())
    +
    + + +

    CGI Analog clock

    + +

    Clock Example output

    + +
    +#!/usr/bin/env lua
    +
    +-- a cgi script that draws an analog clock with lua and lua-gd
    +-- (c) 2004 Alexandre Erwin Ittner
    +
    +local gd = require("gd")
    +
    +function createClock(size, hours, minutes)
    +  local im = gd.createTrueColor(size, size)
    +  local white = im:colorAllocate(255, 255, 255)
    +  local gray = im:colorAllocate(128, 128, 128)
    +  local black = im:colorAllocate(0, 0, 0)
    +  local blue = im:colorAllocate(0, 0, 128)
    +  local cxy = size/2
    +
    +  im:filledRectangle(0, 0, size, size, white)
    +  im:setThickness(math.max(1, size/100))
    +  im:arc(cxy, cxy, size, size, 0, 360, black)
    +
    +  local ang = 0
    +  local rang, gsize
    +  while ang < 360 do
    +    rang = math.rad(ang)
    +    if (ang % 90) == 0 then
    +      gsize = 0.75
    +    else
    +      gsize = 0.85
    +    end
    +    im:line(
    +      cxy + gsize * cxy * math.sin(rang),
    +      size - (cxy + gsize * cxy * math.cos(rang)),
    +      cxy + cxy * 0.9 * math.sin(rang),
    +      size - (cxy + cxy * 0.9 * math.cos(rang)),
    +      gray)
    +    ang = ang + 30
    +  end
    +
    +  im:setThickness(math.max(1, size/50))
    +  im:line(cxy, cxy,
    +    cxy + 0.45 * size * math.sin(math.rad(6*minutes)),
    +    size - (cxy + 0.45 * size * math.cos(math.rad(6*minutes))),
    +    blue)
    +
    +  im:setThickness(math.max(1, size/25))
    +  rang = math.rad(30*hours + minutes/2)
    +  im:line(cxy, cxy, 
    +    cxy + 0.25 * size * math.sin(rang),
    +    size - (cxy + 0.25 * size * math.cos(rang)),
    +    blue)
    +
    +  im:setThickness(1)
    +  local sp = math.max(1, size/20)
    +  im:filledArc(cxy, cxy, sp, sp, 0, 360, black, gd.ARC)
    +
    +  return im
    +end
    +
    +dh = os.date("*t")
    +im = createClock(100, dh.hour, dh.min)
    +
    +print("Content-type: image/png")
    +print("Refresh: 60")            -- Ask browser to reload the image after 60s
    +print("Pragma: no-cache")       -- Can mozilla understand this?
    +print("Expires: Thu Jan 01 00:00:00 UTC 1970")  -- Marks as expired
    +print("")
    +
    +io.write(im:pngStr())
    +
    + + +

    The Sierpinski triangle

    + +

    The Sierpinski triangle

    + +
    +#!/usr/bin/env lua
    +-- Draws the famous Sierpinski triangle with lua-gd
    +
    +local gd = require("gd")
    +
    +size = 250
    +im = gd.createPalette(size, size)
    +white = im:colorAllocate(255, 255, 255)
    +black = im:colorAllocate(0, 0, 0)
    +
    +m = {}
    +m[math.floor(size/2)] = true
    +
    +for i = 1, size do
    +  n = {}
    +  for j = 1, size do
    +    if m[j] then
    +      im:setPixel(j, i, black)
    +      n[j+1] = not n[j+1]
    +      n[j-1] = not n[j-1]
    +    end
    +  end
    +  m = n
    +end
    +
    +im:png("sierpinski.png")
    +
    + + + + +

    Using Freetype, Fontconfig and TrueType fonts

    + +

    Fontconfig Example output

    + +
    +-- The fonts used in this example comes with Microsoft operating systems 
    +-- and can be downloaded from http://corefonts.sourceforge.net
    +
    +local gd = require("gd")
    +
    +im = gd.createTrueColor(220, 190)
    +white = im:colorAllocate(255, 255, 255)
    +black = im:colorAllocate(0, 0, 0)
    +x, y = im:sizeXY()
    +im:filledRectangle(0, 0, x, y, white)
    +
    +gd.useFontConfig(true)
    +im:stringFT(black, "Arial", 20, 0, 10, 30, "Standard Arial")
    +im:stringFT(black, "Arial:bold", 20, 0, 10, 60, "Bold Arial")
    +im:stringFT(black, "Arial:italic", 20, 0, 10, 90, "Italic Arial")
    +im:stringFT(black, "Arial:bold:italic", 20, 0, 10, 120, "Italic Bold Arial")
    +im:stringFT(black, "Times New Roman", 20, 0, 10, 150, "Times New Roman")
    +im:stringFT(black, "Comic Sans MS", 20, 0, 10, 180, "Comic Sans MS")
    +
    +im:png("out.png")
    +
    + + + +

    GIF animation

    + +

    A GIF animation

    + +
    +local gd = require("gd")
    +
    +im = gd.createPalette(120, 120)
    +assert(im)
    +
    +black = im:colorAllocate(0, 0, 0)
    +blue = {}
    +for i = 1, 20 do
    +  blue[i] = im:colorAllocate(0, 0, 120+6*i)
    +end
    +
    +fp = io.open("out.gif", "w")
    +assert(fp, "Failed to open file for writting")
    +
    +fp:write(im:gifAnimBeginStr(true, 0))
    +
    +for i = 1, 20 do
    +  tim = gd.createPalette(120, 120)
    +  tim:paletteCopy(im)
    +  tim:arc(60, 60, 6*i, 6*i, 0, 360, blue[21-i])
    +  fp:write(tim:gifAnimAddStr(false, 0, 0, 5, gd.DISPOSAL_NONE))
    +end
    +
    +fp:write(gd.gifAnimEndStr())
    +fp:close()
    +
    + + + +

    A Steganography Application

    + +

    + Original test image. + Image with a staganographic message + Resulting image from 'steg.lua diff' +
    + Left: Original test image. Center: Image with a steganographic message (no + visible changes); Right: resulting image from "steg.lua diff" + showing, in color, the pixels changed to store the message. +

    + + +
    +#/usr/bin/env lua
    +--[[
    +                      Steganography with Lua-GD
    +
    +Steganography is the technique of writing hidden messages in such a way
    +that no one apart from the intended recipient knows of the existence of
    +the message; this is in contrast to cryptography, where the existence
    +of the message is clear, but the meaning is obscured. Generally a
    +steganographic message will appear to be something else, like a shopping
    +list, an article, a picture, or some other "cover" message. In the
    +digital age, steganography works by replacing bits of useless or unused
    +data in regular computer files (such as graphics, sound, text, HTML, or
    +even floppy disks) with bits of different, invisible information. This
    +hidden information can be plain text, cipher text or even images.
    +
    +
    +                           A Simple Example
    +
    +If Alice wants to send a secret message to Bob through an insecure
    +channel, she can use some encryption software (like GnuPG) to encrypt
    +the message with Bob's public key. It's a good solution because no
    +one unless Bob will be able to read the message. She can also sign the
    +message so Bob will know that the message really comes from her. BUT,
    +a potential attacker will know that a ciphered message was sent. If the
    +attacker has control over the communication channel, he might block the
    +message in some way that Bob will never receive it. If Alice also HIDES
    +the ciphertext in an unsuspected piece of information (like a photo of her
    +cat) the attacker will not detect it and the message will arrive to Bob.
    +
    +This program will help Alice to hide some arbitrary text in a PNG image by
    +replacing the least significant bits of each color channel of some pixels
    +with bits from the encrypted message. PNG or other loseless compression
    +algorithm are mandatory here, since compressing the image with a lossy
    +algorithm will destroy the stored information. The maximum length of the
    +message is limited by the image's size (each byte needs 8 color channels or
    +2 pixels and 2 channels from the next pixel). So, the image must have at
    +least "ceil((length+1)*8/3)" pixels (the extra byte is the NUL marker for
    +the end of the string). So, if Alice's message is "Meet me in the secret
    +place at nine o'clock.", she will encrypt and sign it to something like
    +"PyJYDpz5LCOSHPiXDvLHmVzxLV8qS7EFvZnoo1Mxk+BlT+7lMjpQKs" (imagine Alice's
    +cat walking in you keyboard :). This is the ciphertext that will be sent
    +to Bob through the image.
    +
    +The following table shows what happens to the first eight pixels from
    +the image when mixed to the first three bytes from the encrypted message:
    +
    +
    +         +-----+---+----------+-----------------+----------+
    +         | Pix | C | Orig img |     Message     | New img  |
    +         |  #  |   |   bits   | Chr | Dec | Bin |   bits   |
    +         +-----+---+----------+-----+-----+-----+----------+
    +         |     | R | 01010010 |     |     |  0  | 01010010 |
    +         |  1  | G | 00101010 |     |     |  1  | 00101011 |
    +         |_____| B | 00010101 |     |     |  0  | 00010100 |
    +         |     | R | 11100100 |  P  | 080 |  1  | 11100101 |
    +         |  2  | G | 00100100 |     |     |  0  | 00100100 |
    +         |_____| B | 01001111 |     |     |  0  | 01001110 |
    +         |     | R | 01010010 |     |     |  0  | 01010010 |
    +         |  3  | G | 00101110 |_____|_____|__0__| 00101110 |
    +         |_____| B | 00111001 |     |     |  0  | 00111000 |
    +         |     | R | 10010110 |     |     |  1  | 10010111 |
    +         |  4  | G | 01011101 |     |     |  1  | 01011101 |
    +         |_____| B | 00100101 |  y  | 121 |  1  | 00100101 |
    +         |     | R | 01001001 |     |     |  1  | 01001001 |
    +         |  5  | G | 10110110 |     |     |  0  | 10110110 |
    +         |_____| B | 00010101 |     |     |  0  | 00010100 |
    +         |     | R | 00110100 |_____|_____|__1__| 00110101 |
    +         |  6  | G | 01000111 |     |     |  0  | 01000110 |
    +         |_____| B | 01001000 |     |     |  1  | 01001001 |
    +         |     | R | 01010110 |     |     |  0  | 01010110 |
    +         |  7  | G | 00011001 |     |     |  0  | 00011000 |
    +         |_____| B | 10010100 |  J  | 074 |  1  | 10010101 |
    +         |     | R | 00010101 |     |     |  0  | 00010100 |
    +         |  8  | G | 01011010 |     |     |  1  | 01011011 |
    +         |     | B | 01010001 |     |     |  0  | 01010000 |
    +         +-----+---+----------+-----+-----+-----+----------+
    +
    +
    +When Bob wants to read the message he will extract the least significant
    +bit (LSB) from each color channel from some pixels of the image and
    +join them to get the original ciphertext. A NULL character (ASCII #0)
    +will mark the end of the message within the image, so he will know when
    +to stop. Of course, this program will also do this boring job for Bob.
    +
    +--]]
    +
    +local gd = require("gd")
    +
    +function getLSB(n)
    +  return (n % 2) ~= 0
    +end
    +
    +
    +-- Bizarre way to do some bit-level operations without bitlib.
    +function setLSB(n, b)
    +  if type(b) == "number" then
    +    if b == 0 then
    +      b = false
    +    else
    +      b = true
    +    end
    +  end
    +  if getLSB(n) then
    +    if b then
    +      return n
    +    elseif n > 0 then
    +      return n - 1
    +    else
    +      return n + 1
    +    end
    +  else
    +    if not b then
    +      return n
    +    elseif n > 0 then
    +      return n - 1
    +    else
    +      return n + 1
    +    end
    +  end
    +end
    +
    +
    +function intToBitArray(n)
    +  local ret = {}
    +  local i = 0
    +  while n ~= 0 do
    +    ret[i] = getLSB(n)
    +    n = math.floor(n/2)
    +    ret.size = i
    +    i = i + 1
    +  end 
    +  return ret
    +end
    +
    +
    +function printBitArray(a)
    +  local i
    +  for i = a.size,0,-1 do
    +    if a[i] then
    +      io.write("1")
    +    else    
    +      io.write("0")
    +    end
    +  end
    +end
    +
    +
    +function mergeMessage(im, msg)
    +  local w, h = im:sizeXY()
    +  msg = msg .. string.char(0)
    +  local len = string.len(msg)
    +  if h * w < len * 8 then
    +    return nil
    +  end
    +  local x, y = 0, 0
    +  local oim = gd.createTrueColor(w, h)
    +  local i = 1
    +  local a2, c, nc, chr
    +  local a = {}
    +  local s, e = 1, 1
    +  local rgb = {}
    +
    +  while y < h do
    +    c = im:getPixel(x, y)
    +    rgb.r = im:red(c)
    +    rgb.g = im:green(c)
    +    rgb.b = im:blue(c)
    +    if i <= len and  e - s < 3 then
    +      a2 = intToBitArray(string.byte(string.sub(msg, i, i)))
    +      for cnt = 7,0,-1 do
    +        a[e+7-cnt] = a2[cnt]
    +      end
    +      i = i + 1
    +      e = e + 8
    +    end
    +    if e - s > 0 then
    +      rgb.r = setLSB(rgb.r, a[s])
    +      a[s] = nil
    +      s = s + 1
    +    end
    +    if e - s > 0 then
    +      rgb.g = setLSB(rgb.g, a[s])
    +      a[s] = nil
    +      s = s + 1
    +    end
    +    if e - s > 0 then
    +      rgb.b = setLSB(rgb.b, a[s])
    +      a[s] = nil
    +      s = s + 1
    +    end
    +    nc = oim:colorResolve(rgb.r, rgb.g, rgb.b)
    +    oim:setPixel(x, y, nc)
    +    x = x + 1
    +    if x == w then
    +      x = 0
    +      y = y + 1
    +    end
    +  end
    +  return oim, len*8, w*h
    +end
    +
    +
    +function getMessage(im)
    +  local msg = {}
    +  local w, h = im:sizeXY()
    +  local x, y = 0, 0
    +  local a = {}
    +  local s, e = 1, 1
    +  local b = 0
    +  local c
    +  while y <= h do
    +    c = im:getPixel(x, y)
    +    a[e] = getLSB(im:red(c))
    +    a[e+1] = getLSB(im:green(c))
    +    a[e+2] = getLSB(im:blue(c))
    +    e = e + 2
    +    if e - s >= 7 then
    +      b = 0
    +      for p = s, s+7 do
    +        b = b * 2
    +        if a[p] then
    +          b = b + 1
    +        end
    +        a[p] = nil
    +      end
    +      s = s + 8
    +      if b == 0 then
    +        return table.concat(msg)
    +      else
    +        msg[#msg+1] = string.char(b)
    +      end
    +    end
    +    e = e + 1
    +    x = x + 1
    +    if x == w then
    +      x = 0
    +      y = y + 1
    +    end
    +  end
    +  return table.concat(msg)
    +end
    +
    +
    +function compare(fimg1, fimg2)
    +  local im1 = gd.createFromPng(fimg1)
    +  if not im1 then
    +    print("ERROR: " .. fimg1 .. " bad PNG data.")
    +    os.exit(1)
    +  end
    +  local im2 = gd.createFromPng(fimg2)
    +  if not im2 then
    +    print("ERROR: " .. fimg2 .. " bad PNG data.")
    +    os.exit(1)
    +  end
    +  local w1, h1 = im1:sizeXY()
    +  local w2, h2 = im2:sizeXY()
    +  if w1 ~= w2 or h1 ~= h2 then
    +    print("ERROR: Images have different sizes.")
    +    os.exit(1)
    +  end
    +  local oim = gd.createTrueColor(w1, h1)
    +  local x, y = 0, 0
    +  local c1, c2, oc, f, fc
    +  while y < h1 do
    +    c1 = im1:getPixel(x, y)
    +    c2 = im2:getPixel(x, y)
    +    if im1:red(c1) ~= im2:red(c2)
    +    or im1:green(c1) ~= im2:green(c2)
    +    or im1:blue(c1) ~= im2:blue(c2) then
    +      oc = oim:colorResolve(im2:red(c2), im2:green(c2), im2:blue(c2))
    +      oim:setPixel(x, y, oc)
    +    else
    +      f = math.floor((im1:red(c1) + im1:green(c1) + im1:blue(c1))/6.0)
    +      fc = oim:colorResolve(f, f, f)
    +      oim:setPixel(x, y, fc)
    +    end
    +    x = x + 1
    +    if x == w1 then
    +      x = 0
    +      y = y + 1
    +    end
    +  end
    +  return oim
    +end
    +    
    +
    +function usage()
    +  print("Usage:")
    +  print(" lua steg.lua hide <input file> <output file>")
    +  print(" lua steg.lua show <input file>")
    +  print(" lua steg.lua diff <input file 1> <input file 2> <output file>")
    +  print("")
    +  print(" hide - Reads a message from stdin and saves into <output file>.")
    +  print(" show - Reads a message from <input file> and prints it to stdout.")
    +  print(" diff - Compares two images and writes the diff to <output file>.")
    +  print("")
    +  print(" WARNING: All files used here must be in the PNG format!")
    +end
    +
    +
    +if not arg[1] or not arg[2] then
    +  usage()
    +  os.exit(1)
    +end
    +
    +if arg[1] == "show" then
    +  im = gd.createFromPng(arg[2])
    +  if not im then    
    +    print("ERROR: Bad image data.")
    +    os.exit(1)
    +  end
    +  io.write(getMessage(im))
    +  os.exit(0)
    +end
    +
    +if arg[1] == "hide" then
    +  if not arg[3] then
    +    usage()
    +    os.exit(1)
    +  end
    +  im = gd.createFromPng(arg[2])
    +  if not im then
    +    print("ERROR: Bad image data.")
    +    os.exit(1)
    +  end
    +  print("Type your message and press CTRL+D to finish.")
    +  msg = io.read("*a")
    +  oim, l, t = mergeMessage(im, msg)
    +  if not oim then
    +    print("ERROR: Image is too small for the message.")
    +    os.exit(1)
    +  end
    +  if not oim:png(arg[3]) then
    +    print("ERROR: Failed to write output file.")
    +    os.exit(1)
    +  end
    +  print(string.format("DONE: %2.1f%% of the image used to store the message.",
    +    100.0*l/t))
    +  os.exit(0)
    +end
    +
    +if arg[1] == "diff" then
    +  if not arg[3] and arg[4] then
    +    usage()
    +    os.exit(1)
    +  end
    +  oim = compare(arg[2], arg[3])
    +  if not oim:png(arg[4]) then
    +    print("ERROR: Failed to write output file.")
    +    os.exit(1)
    +  end
    +  os.exit(0)
    +end
    +
    +usage()
    +os.exit(1)
    +
    + + + +

    Other examples

    +

    There are some useful examples in the demos directory +within the distribution package.

    + + + + +

    Contact information

    + +

    Author: Alexandre Erwin Ittner
    +Email: alexandre#ittner.com.br +(email obfuscated to avoid spam-bots. Please replace the "#" with an "@"). + +
    GnuPG/PGP Key: 0x0041A1FB + (key fingerprint: 9B49 FCE2 E6B9 D1AD 6101 29AD 4F6D F114 0041 A1FB). +
    Homepage: http://www.ittner.com.br/. +
    Location: Jaraguá do Sul, Santa Catarina, Brazil. +

    + + +
    + + + + + diff --git a/doc/lua-gd.png b/doc/lua-gd.png new file mode 100644 index 0000000000000000000000000000000000000000..66412c8d4a55034e588e940c2420087b4a3b33ed GIT binary patch literal 13240 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 Kb6Mw<&;$TS2hLjd|zA}ZBTq15W zS(@9Uq_d=~_Y|8b+ZW%>dU-cQ*h!U>EpYCTjv-+(y5G65Ir(u(i>Ohmfnv2^Gpm6t zmwl>GDh&cE)`f4SA*ej!s9_Gd!hDj9dZA(R?epc0C!?DBW^*zbg;WFvy{m+oH2-&N zj|EY8@q2Kj9v)Yu@_Bkg;xP?Q? zdeq_w=B$vMR!AsoVT8AU>Nw5)U{uU*3t*|jd_gDQocW@f9v@l10owgwo&OnDInL&qEzVe^nzw}(f5ZzFWIA} zM;Y_7Pe$g8CG0i5A*Q50tsQ_POQxgt&0sF0BM|TTm_*Cr4%>emB21996qoT?UF?xq zp`Kb{UePa)L_JoRBp@zvg?_P}XixKw88%6$ApQV4BdvM>((Cj90000 +License: MIT +Group: Libraries +Group(pt_BR): Bibliotecas +Source0: %{name}-%{version}.tar.gz +URL: http://lua-gd.luaforge.net/ +BuildRoot: %{_tmppath}/%{name}-%{version}-root +Requires: lua >= 5.1 +Requires: libgd2 >= 2.0.33 +BuildRequires: lua-devel +BuildRequires: libgd-devel >= 2.0.33 +Prefix: /usr +Provides: luagd + +%description +Lua-GD is a library that allows you to use the gd graphic library from +programs written in the Lua programming language. + + +%description -l pt_BR +Lua-GD é uma biblioteca que permite usar a biblioteca gráfica gd em +programas escritos na linguagem Lua. + + +%prep +%setup -q + +%build +make + +%install +mkdir -p $RPM_BUILD_ROOT%{_libdir} +cp *.so $RPM_BUILD_ROOT%{_libdir} + +%clean +rm -rf %{buildroot} $RPM_BUILD_ROOT $RPM_BUILD_DIR/%{name}-%{version} + +%post +/sbin/ldconfig + +%postun +/sbin/ldconfig + +%files +%defattr(-,root,root) +%doc README COPYING doc/* demos +%{_libdir}/*.so* + +%changelog +* Sun Aug 28 2005 Alexandre Erwin Ittner +- First version of this package. +* Sun Apr 30 2006 Alexandre Erwin Ittner +- New version. License update. + + diff --git a/luagd-2.0.33r3-1.rockspec b/luagd-2.0.33r3-1.rockspec new file mode 100644 index 000000000..eeead4375 --- /dev/null +++ b/luagd-2.0.33r3-1.rockspec @@ -0,0 +1,43 @@ +package = "LuaGD" +version = "2.0.33r3-1" + +source = { + url = "https://github.com/ittner/lua-gd/archive/lua-gd-2.0.33r3.tar.gz", +} + +description = { + summary = "Lua binding to LibGD", + detailed = [[ +Lua-GD is a set of Lua bindings to the Thomas Boutell's gd library that +allows your code to quickly draw complete images with lines, polygons, arcs, +text, multiple colors, cut and paste from other images, flood fills, read in +or write out images in the PNG, JPEG or GIF format. It is not a kitchen-sink +graphics package, but it does include most frequently requested features, +including both truecolor and palette images, resampling (smooth resizing of +truecolor images) and so forth. It is particularly useful in Web applications. +]], + homepage = "http://ittner.github.io/lua-gd/", + license = "MIT/X11", + maintainer = "Alexandre Erwin Ittner" +} + +dependencies = { + "lua >= 5.1" +} + +external_dependencies = { + GD = { header = "gd.h" } +} + +build = { + type = "make", + platforms = { + unix = { + build_pass = true, + install_pass = false, + install = { lib = { "gd.so" } }, + copy_directories = { "doc", "demos" } + } + -- Some way to detect GD features on Windows? + } +} diff --git a/luagd.c b/luagd.c new file mode 100644 index 000000000..9730ff70a --- /dev/null +++ b/luagd.c @@ -0,0 +1,2361 @@ +/* + * luagd -- GD bindings for Lua. + * (c) 2004-13 Alexandre Erwin Ittner + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHOR OR COPYRIGHT HOLDER BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * If you use this package in a product, an acknowledgment in the product + * documentation would be greatly appreciated (but it is not required). + * + */ + +#include +#include +#include + +#include + +/* Standard gd fonts */ +#include +#include +#include +#include +#include + +#ifndef VERSION + #error "Trying to build without -DVERSION=xxx defined. Check the Makefile" +#endif +#define LIB_VERSION "lua-gd " VERSION +#define LIB_COPYRIGHT LIB_VERSION " (c) 2004-13 Alexandre Erwin Ittner" + +#define GD_IMAGE_PTR_TYPENAME "gdImagePtr_handle" + + +/* Compatibility between Lua 5.1 and Lua 5.2 */ +#if LUA_VERSION_NUM < 501 + #error "Unsuported Lua version. You must use Lua >= 5.1" +#endif + +#if LUA_VERSION_NUM < 502 + #define luaL_setfuncs(L, f, unused) { luaL_register(L, NULL, f); } + #define lua_rawlen lua_objlen +#endif + +#define boxptr(L, p) (*(void**)(lua_newuserdata(L, sizeof(void*))) = (p)) +#define unboxptr(L, i) (*(void**)(lua_touserdata(L, i))) + +/* Table assumed on top */ +#define tblseticons(L, c, v) \ + lua_pushliteral(L, c); \ + lua_pushnumber(L, v); \ + lua_settable(L, -3); + +/* Standard gd fonts */ +#define MY_GD_FONT_SMALL 0 +#define MY_GD_FONT_LARGE 1 +#define MY_GD_FONT_MEDIUM_BOLD 2 +#define MY_GD_FONT_GIANT 3 +#define MY_GD_FONT_TINY 4 + + +static int typerror(lua_State *L, int narg, const char *tname) { + const char *msg = lua_pushfstring(L, "%s expected, got %s", + tname, luaL_typename(L, narg)); + return luaL_argerror(L, narg, msg); +} + + +static gdImagePtr getImagePtr(lua_State *L, int i) { + if (luaL_checkudata(L, i, GD_IMAGE_PTR_TYPENAME) != NULL) { + gdImagePtr im = unboxptr(L, i); + if (im == NULL) + luaL_error(L, "attempt to use an invalid " GD_IMAGE_PTR_TYPENAME); + return im; + } + typerror(L, i, GD_IMAGE_PTR_TYPENAME); + return NULL; +} + + +static void pushImagePtr(lua_State *L, gdImagePtr im) { + boxptr(L, im); + luaL_getmetatable(L, GD_IMAGE_PTR_TYPENAME); + lua_setmetatable(L, -2); /* Done */ +} + + +static gdFontPtr getStdFont(lua_State *L, int i) { + int size; + + if (lua_isnumber(L, i) == 0) { + typerror(L, i, "Standard GD Font"); + return gdFontGetSmall(); + } + + size = luaL_checkinteger(L, i); + switch(size) { + case MY_GD_FONT_SMALL: + return gdFontGetSmall(); + + case MY_GD_FONT_LARGE: + return gdFontGetLarge(); + + case MY_GD_FONT_MEDIUM_BOLD: + return gdFontGetMediumBold(); + + case MY_GD_FONT_GIANT: + return gdFontGetGiant(); + + case MY_GD_FONT_TINY: + return gdFontGetTiny(); + + default: + typerror(L, i, "Standard GD Font"); + return gdFontGetSmall(); + } + + return gdFontGetSmall(); /* Not reached */ +} + + + + +/* + * Reads a Lua table and returns a pointer to a "gdFTStringExtra" struct. The + * table should have the following fields: + * + * { + * linespacing = 1.0, -- linespacing for '\n' + * charmap = gd.FTEX_Unicode, -- default charset + * hdpi = 96, -- horizontal resolution + * vdpi = 96, -- vertical resolution + * disable_kerning = true, -- disable kerning? + * xshow = true, -- return char positions? + * return_font_path_name = true, -- return font path names? + * fontconfig = true -- use fontconfig? + * } + * + */ +#ifdef GD_FREETYPE +static gdFTStringExtra *getFTStringExtraPtr(lua_State *L, int i) { + luaL_checktype(L, i, LUA_TTABLE); + + gdFTStringExtra *ex = (gdFTStringExtra*) malloc(sizeof(gdFTStringExtra)); + if (ex == NULL) + luaL_error(L, "Memory allocation failure"); + + ex->flags = 0; + + lua_pushstring(L, "linespacing"); + lua_gettable(L, i); + if (!lua_isnil(L, -1)) { + ex->flags |= gdFTEX_LINESPACE; + ex->linespacing = (double) lua_tonumber(L, -1); + } + lua_pop(L, 1); + + lua_pushstring(L, "charmap"); + lua_gettable(L, i); + if (!lua_isnil(L, -1)) { + ex->flags |= gdFTEX_CHARMAP;; + ex->charmap = (int) lua_tonumber(L, -1); + switch(ex->charmap) { + case gdFTEX_Unicode: + case gdFTEX_Shift_JIS: + case gdFTEX_Big5: + /* Future charsets here */ + break; + default: + free(ex); + luaL_error(L, "Invalid charset"); + } + } + lua_pop(L, 1); + + ex->hdpi = 96; + ex->vdpi = 96; + + lua_pushstring(L, "hdpi"); + lua_gettable(L, i); + if (!lua_isnil(L, -1)) { + ex->flags |= gdFTEX_RESOLUTION; + ex->hdpi = (double) lua_tonumber(L, -1); + } + lua_pop(L, 1); + + lua_pushstring(L, "vdpi"); + lua_gettable(L, i); + if (!lua_isnil(L, -1)) { + ex->flags |= gdFTEX_RESOLUTION; + ex->vdpi = (double) lua_tonumber(L, -1); + } + lua_pop(L, 1); + + lua_pushstring(L, "disable_kerning"); + lua_gettable(L, i); + if (lua_toboolean(L, -1)) + ex->flags |= gdFTEX_DISABLE_KERNING; + lua_pop(L, 1); + + lua_pushvalue(L, i); + lua_pushstring(L, "xshow"); + lua_gettable(L, i); + if (lua_toboolean(L, -1)) + ex->flags |= gdFTEX_XSHOW; + lua_pop(L, 1); + + lua_pushstring(L, "return_font_path_name"); + lua_gettable(L, i); + if (lua_toboolean(L, -1)) + ex->flags |= gdFTEX_RETURNFONTPATHNAME; + lua_pop(L, 1); + + lua_pushstring(L, "fontconfig"); + lua_gettable(L, i); + if (lua_toboolean(L, -1)) + ex->flags |= gdFTEX_FONTCONFIG; + lua_pop(L, 1); + + return ex; +} +#endif + + +/* gdImageCreate(int sx, int sy) */ +static int LgdImageCreate(lua_State *L) { + int sx, sy; + gdImagePtr im; + + sx = luaL_checkinteger(L, 1); + sy = luaL_checkinteger(L, 2); + im = gdImageCreate(sx, sy); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} + +/* gdImageCreatePalette(int sx, int sy) */ +/* Useless? */ +static int LgdImageCreatePalette(lua_State *L) { + int sx, sy; + gdImagePtr im; + + sx = luaL_checkinteger(L, 1); + sy = luaL_checkinteger(L, 2); + im = gdImageCreatePalette(sx, sy); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} + + + +/* gdImageCreateTrueColor(int sx, int sy) */ +static int LgdImageCreateTrueColor(lua_State *L) { + int sx, sy; + gdImagePtr im; + + sx = luaL_checkinteger(L, 1); + sy = luaL_checkinteger(L, 2); + im = gdImageCreateTrueColor(sx, sy); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} + +/* gdImagePtr gdImageCreatePaletteFromTrueColor(gdImagePtr im, int ditherFlag, + int colorsWanted) */ +static int LgdImageCreatePaletteFromTrueColor(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int dither = lua_toboolean(L, 2); + int colors = luaL_checkinteger(L, 3); + gdImagePtr nim = gdImageCreatePaletteFromTrueColor(im, dither, colors); + + if (nim) + pushImagePtr(L, nim); + else + lua_pushnil(L); + return 1; +} + + +/* void gdImageTrueColorToPalette(gdImagePtr im, int ditherFlag, + int colorsWanted) */ +static int LgdImageTrueColorToPalette(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int dither = lua_toboolean(L, 2); + int colors = luaL_checkinteger(L, 3); + + gdImageTrueColorToPalette(im, dither, colors); + return 0; +} + + + +/* gdImageDestroy(gdImagePtr im) */ +static int LgdImageDestroy(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + if (im) + gdImageDestroy(im); + return 0; +} + +#ifdef GD_JPEG +/* gdImageCreateFromJpeg(FILE *in) */ +/* Changed to: gd.createFromJpeg(char *filename) */ +static int LgdImageCreateFromJpeg(lua_State *L) { + gdImagePtr im; + FILE *fp; + const char *fname = luaL_checkstring(L, 1); + + if (fname == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + if ((fp = fopen(fname, "rb")) == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + im = gdImageCreateFromJpeg(fp); + fclose(fp); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} + + +/* gdImageCreateFromJpegPtr(int size, void *data) */ +static int LgdImageCreateFromJpegPtr(lua_State *L) { + gdImagePtr im; + int size = lua_rawlen(L, 1); + void *str = (void*) luaL_checkstring(L, 1); + + if (str == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + im = gdImageCreateFromJpegPtr(size, str); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} +#endif + + +#ifdef GD_GIF +/* gdImageCreateFromGif (FILE *in) */ +/* Changed to: gd.createFromGif (filename) */ +static int LgdImageCreateFromGif (lua_State *L) { + gdImagePtr im; + FILE *fp; + const char *fname = luaL_checkstring(L, 1); + + if (fname == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + if ((fp = fopen(fname, "rb")) == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + im = gdImageCreateFromGif (fp); + fclose(fp); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} + +/* gdImageCreateFromGifPtr(int size, void *data) */ +static int LgdImageCreateFromGifPtr(lua_State *L) { + gdImagePtr im; + int size = lua_rawlen(L, 1); + void *str = (void*) luaL_checkstring(L, 1); + + if (str == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + im = gdImageCreateFromGifPtr(size, str); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} +#endif + + +#ifdef GD_PNG +/* gdImageCreateFromPng(FILE *in) */ +/* Changed to: gd.createFromPng(filename) */ +static int LgdImageCreateFromPng(lua_State *L) { + gdImagePtr im; + FILE *fp; + const char *fname = luaL_checkstring(L, 1); + + if (fname == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + if ((fp = fopen(fname, "rb")) == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + im = gdImageCreateFromPng(fp); + fclose(fp); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} + + +/* gdImageCreateFromPngPtr(int size, void *data) */ +static int LgdImageCreateFromPngPtr(lua_State *L) { + gdImagePtr im; + int size = lua_rawlen(L, 1); + void *str = (void*) luaL_checkstring(L, 1); + + if (str == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + im = gdImageCreateFromPngPtr(size, str); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} +#endif + + +/* gdImageCreateFromGd(FILE *in) */ +/* Changed to: gd.createFromGd(filename) */ +static int LgdImageCreateFromGd(lua_State *L) { + gdImagePtr im; + FILE *fp; + const char *fname = luaL_checkstring(L, 1); + + if (fname == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + if ((fp = fopen(fname, "rb")) == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + im = gdImageCreateFromGd(fp); + fclose(fp); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} + + +/* gdImageCreateFromGdPtr(int size, void *data) */ +static int LgdImageCreateFromGdPtr(lua_State *L) { + gdImagePtr im; + int size = lua_rawlen(L, 1); + void *str = (void*) luaL_checkstring(L, 1); + + if (str == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + im = gdImageCreateFromGdPtr(size, str); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} + + +/* gdImageCreateFromGd2(FILE *in) */ +/* Changed to: gd.createFromGd2(filename) */ +static int LgdImageCreateFromGd2(lua_State *L) { + gdImagePtr im; + FILE *fp; + const char *fname = luaL_checkstring(L, 1); + + if (fname == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + if ((fp = fopen(fname, "rb")) == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + im = gdImageCreateFromGd2(fp); + fclose(fp); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} + + +/* gdImageCreateFromGd2Ptr(int size, void *data) */ +static int LgdImageCreateFromGd2Ptr(lua_State *L) { + gdImagePtr im; + int size = lua_rawlen(L, 1); + void *str = (void*) luaL_checkstring(L, 1); + + if (str == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + im = gdImageCreateFromGd2Ptr(size, str); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} + + +/* gdImageCreateFromGd2Part(FILE *in, int x, int y, int w, int h) */ +/* Changed to: gd.createFromGd2Part(filename, x, y, w, h)) */ +static int LgdImageCreateFromGd2Part(lua_State *L) { + gdImagePtr im; + FILE *fp; + const char *fname = luaL_checkstring(L, 1); + const int x = luaL_checkinteger(L, 2); + const int y = luaL_checkinteger(L, 3); + const int w = luaL_checkinteger(L, 4); + const int h = luaL_checkinteger(L, 5); + + if (fname == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + if ((fp = fopen(fname, "rb")) == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + im = gdImageCreateFromGd2Part(fp, x, y, w, h); + fclose(fp); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} + + +/* gdImageCreateFromGd2PartPtr(int size, void *data, + int srcX, int srcY, int w, int h) */ +static int LgdImageCreateFromGd2PartPtr(lua_State *L) { + gdImagePtr im; + int size = lua_rawlen(L, 1); + void *str = (void*) luaL_checkstring(L, 1); + const int x = luaL_checkinteger(L, 2); + const int y = luaL_checkinteger(L, 3); + const int w = luaL_checkinteger(L, 4); + const int h = luaL_checkinteger(L, 5); + + if (str == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + im = gdImageCreateFromGd2PartPtr(size, str, x, y, w, h); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} + + +#ifdef GD_XPM +/* gdImageCreateFromXbm(FILE *in) */ +/* Changed to: gd.createFromXbm(filename) */ +static int LgdImageCreateFromXbm(lua_State *L) { + gdImagePtr im; + FILE *fp; + const char *fname = luaL_checkstring(L, 1); + + if (fname == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + if ((fp = fopen(fname, "rb")) == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + im = gdImageCreateFromXbm(fp); + fclose(fp); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} + + +/* gdImageCreateFromXpm(char *filename) */ +static int LgdImageCreateFromXpm(lua_State *L) { + gdImagePtr im; + char *fname = (char*) luaL_checkstring(L, 1); + + if (fname == NULL) { + lua_pushnil(L); + return 1; /* Error */ + } + im = gdImageCreateFromXpm(fname); + if (im != NULL) + pushImagePtr(L, im); + else + lua_pushnil(L); /* Error */ + return 1; +} +#endif + + + +#ifdef GD_JPEG +/* gdImageJpeg(gdImagePtr im, FILE *out, int quality) */ +/* Changed to: gd.jpeg(im, fname, quality) */ +static int LgdImageJpeg(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + const char *fname = luaL_checkstring(L, 2); + int quality = luaL_checkinteger(L, 3); + FILE *fp; + + if (fname == NULL) { + lua_pushboolean(L, 0); + return 1; + } + if ((fp = fopen(fname, "wb")) == NULL) { + lua_pushboolean(L, 0); + return 1; + } + gdImageJpeg(im, fp, quality); + fclose(fp); + lua_pushboolean(L, 1); + return 1; +} + + +/* void *gdImageJpegPtr(gdImagePtr im, int quality) */ +static int LgdImageJpegPtr(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int quality = luaL_checkinteger(L, 2); + char *str; + int size; + + str = gdImageJpegPtr(im, &size, quality); + if (str != NULL) { + lua_pushlstring(L, str, size); + gdFree(str); + } else { + lua_pushnil(L); /* Error */ + } + return 1; +} +#endif + +#ifdef GD_PNG +/* gdImagePng(gdImagePtr im, FILE *out) */ +/* Changed to: gd.png(im, fname) */ +static int LgdImagePng(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + const char *fname = luaL_checkstring(L, 2); + FILE *fp; + + if (fname == NULL) { + lua_pushboolean(L, 0); + return 1; + } + if ((fp = fopen(fname, "wb")) == NULL) { + lua_pushboolean(L, 0); + return 1; + } + gdImagePng(im, fp); + fclose(fp); + lua_pushboolean(L, 1); + return 1; +} + + +/* void *gdImagePngPtr(gdImagePtr im) */ +static int LgdImagePngPtr(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + char *str; + int size; + + str = gdImagePngPtr(im, &size); + if (str != NULL) { + lua_pushlstring(L, str, size); + gdFree(str); + } else { + lua_pushnil(L); /* Error */ + } + return 1; +} + + +/* gdImagePngEx(gdImagePtr im, FILE *out, int compression_level) */ +/* Changed to: gd.pngEx(im, fname, compression_level) */ +static int LgdImagePngEx(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + const char *fname = luaL_checkstring(L, 2); + int level = luaL_checkinteger(L, 3); + FILE *fp; + + if (fname == NULL) { + lua_pushboolean(L, 0); + return 1; + } + if ((fp = fopen(fname, "wb")) == NULL) { + lua_pushboolean(L, 0); + return 1; + } + gdImagePngEx(im, fp, level); + fclose(fp); + lua_pushboolean(L, 1); + return 1; +} + + +/* void *gdImagePngPtrEx(gdImagePtr im, int compression_level) */ +static int LgdImagePngPtrEx(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int level = luaL_checkinteger(L, 2); + char *str; + int size; + + str = gdImagePngPtrEx(im, &size, level); + if (str != NULL) { + lua_pushlstring(L, str, size); + gdFree(str); + } else { + lua_pushnil(L); /* Error */ + } + return 1; +} +#endif + + +#ifdef GD_GIF +/* gdImageGif (gdImagePtr im, FILE *out) */ +/* Changed to: gd.gif (im, fname) */ +static int LgdImageGif (lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + const char *fname = luaL_checkstring(L, 2); + FILE *fp; + + if (fname == NULL) { + lua_pushboolean(L, 0); + return 1; + } + if ((fp = fopen(fname, "wb")) == NULL) { + lua_pushboolean(L, 0); + return 1; + } + gdImageGif (im, fp); + fclose(fp); + lua_pushboolean(L, 1); + return 1; +} +#endif + +#ifdef GD_GIF +/* void *gdImageGifPtr(gdImagePtr im) */ +static int LgdImageGifPtr(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + char *str; + int size; + + str = gdImageGifPtr(im, &size); + if (str != NULL) { + lua_pushlstring(L, str, size); + gdFree(str); + } else { + lua_pushnil(L); /* Error */ + } + return 1; +} +#endif + + +/* gdImageGd(gdImagePtr im, FILE *out) */ +/* Changed to: gd.gd(im, fname) */ +static int LgdImageGd(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + const char *fname = luaL_checkstring(L, 2); + FILE *fp; + + if (fname == NULL) { + lua_pushboolean(L, 0); + return 1; + } + if ((fp = fopen(fname, "wb")) == NULL) { + lua_pushboolean(L, 0); + return 1; + } + gdImageGd(im, fp); + fclose(fp); + lua_pushboolean(L, 1); + return 1; +} + + +/* void *gdImageGdPtr(gdImagePtr im) */ +static int LgdImageGdPtr(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + char *str; + int size; + + str = gdImageGdPtr(im, &size); + if (str != NULL) { + lua_pushlstring(L, str, size); + gdFree(str); + } else { + lua_pushnil(L); /* Error */ + } + return 1; +} + + + +/* gdImageGd2(gdImagePtr im, FILE *out, int chunkSize, int fmt) */ +/* Changed to: gd.gd2(im, fname, chunkSize, fmt) */ +static int LgdImageGd2(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + const char *fname = luaL_checkstring(L, 2); + int cs = luaL_checkinteger(L, 3); + int fmt = luaL_checkinteger(L, 4); + FILE *fp; + + if (fname == NULL) { + lua_pushboolean(L, 0); + return 1; + } + if ((fp = fopen(fname, "wb")) == NULL) { + lua_pushboolean(L, 0); + return 1; + } + gdImageGd2(im, fp, cs, fmt); + fclose(fp); + lua_pushboolean(L, 1); + return 1; +} + + +/* void* gdImageGd2Ptr(gdImagePtr im, int chunkSize, int fmt, int *size) */ +static int LgdImageGd2Ptr(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int cs = luaL_checkinteger(L, 2); + int fmt = luaL_checkinteger(L, 3); + char *str; + int size; + + str = gdImageGd2Ptr(im, cs, fmt, &size); + if (str != NULL) { + lua_pushlstring(L, str, size); + gdFree(str); + } else + lua_pushnil(L); /* Error */ + return 1; +} + + +/* void gdImageWBMP(gdImagePtr im, int fg, FILE *out) */ +/* Changed to: gd.wbmp(im, int fg, filename) */ +static int LgdImageWBMP(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int fg = luaL_checkinteger(L, 2); + const char *fname = luaL_checkstring(L, 3); + FILE *fp; + + if (fname == NULL) { + lua_pushnil(L); + return 1; + } + if ((fp = fopen(fname, "wb")) == NULL) { + lua_pushnil(L); + return 1; + } + gdImageWBMP(im, fg, fp); + fclose(fp); + lua_pushboolean(L, 1); + return 1; +} + + +/* void* gdImageWBMPPtr(gdImagePtr im, int *size) */ +static int LgdImageWBMPPtr(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int fg = luaL_checkinteger(L, 2); + char *str; + int size; + + str = gdImageWBMPPtr(im, &size, fg); + if (str != NULL) { + lua_pushlstring(L, str, size); + gdFree(str); + } else { + lua_pushnil(L); /* Error */ + } + return 1; +} + + +/* int gdImageColorAllocate(gdImagePtr im, int r, int g, int b) */ +static int LgdImageColorAllocate(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int r = luaL_checkinteger(L, 2); + int g = luaL_checkinteger(L, 3); + int b = luaL_checkinteger(L, 4); + int c; + + c = gdImageColorAllocate(im, r, g, b); + if (c >= 0) + lua_pushnumber(L, c); /* ok */ + else + lua_pushnil(L); /* Can not allocate color */ + return 1; +} + + +/* int gdImageColorAllocateAlpha(gdImagePtr im, int r, int g, int b, int a) */ +static int LgdImageColorAllocateAlpha(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int r = luaL_checkinteger(L, 2); + int g = luaL_checkinteger(L, 3); + int b = luaL_checkinteger(L, 4); + int a = luaL_checkinteger(L, 5); + int c; + + c = gdImageColorAllocateAlpha(im, r, g, b, a); + if (c >= 0) + lua_pushnumber(L, c); /* ok */ + else + lua_pushnil(L); /* Can not allocate color */ + return 1; +} + + +/* int gdImageColorClosest(gdImagePtr im, int r, int g, int b) */ +static int LgdImageColorClosest(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int r = luaL_checkinteger(L, 2); + int g = luaL_checkinteger(L, 3); + int b = luaL_checkinteger(L, 4); + int c; + + c = gdImageColorClosest(im, r, g, b); + if (c >= 0) + lua_pushnumber(L, c); /* ok */ + else + lua_pushnil(L); /* Can not allocate color */ + return 1; +} + + +/* int gdImageColorClosestAlpha(gdImagePtr im, int r, int g, int b, int a) */ +static int LgdImageColorClosestAlpha(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int r = luaL_checkinteger(L, 2); + int g = luaL_checkinteger(L, 3); + int b = luaL_checkinteger(L, 4); + int a = luaL_checkinteger(L, 5); + int c; + + c = gdImageColorClosestAlpha(im, r, g, b, a); + if (c > 0) + lua_pushnumber(L, c); /* ok */ + else + lua_pushnil(L); /* Can not allocate color */ + return 1; +} + + +/* int gdImageColorClosestHWB(gdImagePtr im, int r, int g, int b) */ +static int LgdImageColorClosestHWB(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int r = luaL_checkinteger(L, 2); + int g = luaL_checkinteger(L, 3); + int b = luaL_checkinteger(L, 4); + int c; + + c = gdImageColorClosestHWB(im, r, g, b); + if (c >= 0) + lua_pushnumber(L, c); /* ok */ + else + lua_pushnil(L); /* Can not allocate color */ + return 1; +} + + +/* int gdImageColorExact(gdImagePtr im, int r, int g, int b) */ +static int LgdImageColorExact(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int r = luaL_checkinteger(L, 2); + int g = luaL_checkinteger(L, 3); + int b = luaL_checkinteger(L, 4); + int c; + + c = gdImageColorExact(im, r, g, b); + if (c >= 0) + lua_pushnumber(L, c); /* ok */ + else + lua_pushnil(L); /* Can not allocate color */ + return 1; +} + + +/* int gdImageColorExactAlpha(gdImagePtr im, int r, int g, int b, int a) */ +static int LgdImageColorExactAlpha(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int r = luaL_checkinteger(L, 2); + int g = luaL_checkinteger(L, 3); + int b = luaL_checkinteger(L, 4); + int a = luaL_checkinteger(L, 5); + int c; + + c = gdImageColorExactAlpha(im, r, g, b, a); + if (c >= 0) + lua_pushnumber(L, c); /* ok */ + else + lua_pushnil(L); /* Can not allocate color */ + return 1; +} + + +/* int gdImageColorResolve(gdImagePtr im, int r, int g, int b) */ +static int LgdImageColorResolve(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int r = luaL_checkinteger(L, 2); + int g = luaL_checkinteger(L, 3); + int b = luaL_checkinteger(L, 4); + int c; + + c = gdImageColorResolve(im, r, g, b); + if (c >= 0) + lua_pushnumber(L, c); /* ok */ + else + lua_pushnil(L); /* Can not allocate color */ + return 1; +} + + +/* int gdImageColorResolveAlpha(gdImagePtr im, int r, int g, int b, int a) */ +static int LgdImageColorResolveAlpha(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int r = luaL_checkinteger(L, 2); + int g = luaL_checkinteger(L, 3); + int b = luaL_checkinteger(L, 4); + int a = luaL_checkinteger(L, 5); + int c; + + c = gdImageColorResolveAlpha(im, r, g, b, a); + if (c >= 0) + lua_pushnumber(L, c); /* ok */ + else + lua_pushnil(L); /* Can not allocate color */ + return 1; +} + + +/* int gdImageColorsTotal(gdImagePtr im) */ +static int LgdImageColorsTotal(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + + lua_pushnumber(L, gdImageColorsTotal(im)); /* ok */ + return 1; +} + + +/* int gdImageRed(gdImagePtr im, int c) */ +static int LgdImageRed(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int c = luaL_checkinteger(L, 2); + + lua_pushnumber(L, gdImageRed(im, c)); /* ok */ + return 1; +} + +/* int gdImageBlue(gdImagePtr im, int c) */ +static int LgdImageBlue(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int c = luaL_checkinteger(L, 2); + + lua_pushnumber(L, gdImageBlue(im, c)); /* ok */ + return 1; +} + +/* int gdImageBlue(gdImagePtr im, int c) */ +static int LgdImageGreen(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int c = luaL_checkinteger(L, 2); + + lua_pushnumber(L, gdImageGreen(im, c)); /* ok */ + return 1; +} + +/* int gdImageAlpha(gdImagePtr im, int color) */ +static int LgdImageAlpha(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int c = luaL_checkinteger(L, 2); + lua_pushnumber(L, gdImageAlpha(im, c)); + return 1; +} + +/* int gdImageGetInterlaced(gdImagePtr im) */ +static int LgdImageGetInterlaced(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int ret = gdImageGetInterlaced(im); + + if (ret != 0) + lua_pushnumber(L, ret); + else + lua_pushnil(L); + return 1; +} + +/* int gdImageGetTransparent(gdImagePtr im) */ +static int LgdImageGetTransparent(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int ret = gdImageGetTransparent(im); + + if (ret != -1) + lua_pushnumber(L, ret); + else + lua_pushnil(L); + return 1; +} + + +/* void gdImageColorTransparent(gdImagePtr im, int c) */ +static int LgdImageColorTransparent(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int c = -1; + if (!lua_isnil(L, 2)) + c = luaL_checkinteger(L, 2); + gdImageColorTransparent(im, c); + return 0; +} + + +/* void gdImageColorDeallocate(gdImagePtr im, int c) */ +static int LgdImageColorDeallocate(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int c = luaL_checkinteger(L, 2); + gdImageColorDeallocate(im, c); + return 0; +} + + +/* int gdImageSX(gdImagePtr im) */ +static int LgdImageSX(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + lua_pushnumber(L, gdImageSX(im)); + return 1; +} + + +/* int gdImageSY(gdImagePtr im) */ +static int LgdImageSY(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + lua_pushnumber(L, gdImageSY(im)); + return 1; +} + + +/* Fear the power of the Moon!! --- x, y = im:sizeXY() */ +static int LgdImageSXY(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + lua_pushnumber(L, gdImageSX(im)); + lua_pushnumber(L, gdImageSY(im)); + return 2; +} + + +/* int gdImageBoundsSafe(gdImagePtr im, int x, int y) */ +static int LgdImageBoundsSafe(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int x = luaL_checkinteger(L, 2); + int y = luaL_checkinteger(L, 3); + + if (gdImageBoundsSafe(im, x, y) != 0) + lua_pushboolean(L, 1); + else + lua_pushboolean(L, 0); + return 1; +} + + +/* int gdImageGetPixel(gdImagePtr im, int x, int y) */ +static int LgdImageGetPixel(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int x = luaL_checkinteger(L, 2); + int y = luaL_checkinteger(L, 3); + + lua_pushnumber(L, gdImageGetPixel(im, x, y)); + return 1; +} + + +/* void gdImageSetPixel(gdImagePtr im, int x, int y, int color) */ +static int LgdImageSetPixel(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int x = luaL_checkinteger(L, 2); + int y = luaL_checkinteger(L, 3); + int c = luaL_checkinteger(L, 4); + + gdImageSetPixel(im, x, y, c); + return 0; +} + + +/* void gdImageLine(gdImagePtr im, int x1, int y1, int x2, int y2, int c) */ +static int LgdImageLine(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int x1 = luaL_checkinteger(L, 2); + int y1 = luaL_checkinteger(L, 3); + int x2 = luaL_checkinteger(L, 4); + int y2 = luaL_checkinteger(L, 5); + int c = luaL_checkinteger(L, 6); + + gdImageLine(im, x1, y1, x2, y2, c); + return 0; +} + +/* void gdImageRectangle(gdImagePtr im, int x1, int y1, int x2, int y2, + int c) */ +static int LgdImageRectangle(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int x1 = luaL_checkinteger(L, 2); + int y1 = luaL_checkinteger(L, 3); + int x2 = luaL_checkinteger(L, 4); + int y2 = luaL_checkinteger(L, 5); + int c = luaL_checkinteger(L, 6); + + gdImageRectangle(im, x1, y1, x2, y2, c); + return 0; +} + + +/* void gdImageFilledRectangle(gdImagePtr im, int x1, int y1, int x2, int y2, + int c) */ +static int LgdImageFilledRectangle(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int x1 = luaL_checkinteger(L, 2); + int y1 = luaL_checkinteger(L, 3); + int x2 = luaL_checkinteger(L, 4); + int y2 = luaL_checkinteger(L, 5); + int c = luaL_checkinteger(L, 6); + + gdImageFilledRectangle(im, x1, y1, x2, y2, c); + return 0; +} + + +/* Stack must have ONLY the table of points */ +static gdPoint *getPointList(lua_State *L, int *size) { + gdPoint *plist; + int i; + + luaL_checktype(L, -1, LUA_TTABLE); + *size = lua_rawlen(L, -1); + plist = (gdPoint*) malloc(*size * sizeof(gdPoint)); + + for (i = 0; i < *size; i++) { + /* Stack: T */ + lua_rawgeti(L, 1, i + 1); + + /* Stack: T, T' */ + if (lua_type(L, 2) != LUA_TTABLE) { + free(plist); + typerror(L, 2, "Point"); + } + + lua_rawgeti(L, 2, 1); + /* Stack: T, T', X */ + plist[i].x = luaL_checkinteger(L, -1); + lua_remove(L, -1); + + lua_rawgeti(L, 2, 2); + /* Stack: T, T', Y */ + plist[i].y = luaL_checkinteger(L, -1); + lua_remove(L, -1); + + /* Stack: T, T' */ + lua_remove(L, -1); + + /* Stack: T */ + } + + lua_remove(L, -1); + return plist; +} + + + +/* void gdImagePolygon(gdImagePtr im, gdPointPtr points, int pointsTotal, + int color) + Changed to: gd.polygon(im, { { x1, y1 }, { x2, y2 } ... }, color) */ +static int LgdImagePolygon(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + gdPoint *plist; + int size; + int c; + + c = luaL_checkinteger(L, 3); + lua_remove(L, 3); /* Get and drop color */ + lua_remove(L, 1); /* Drop image from the stack */ + plist = getPointList(L, &size); + gdImagePolygon(im, plist, size, c); + free(plist); + return 0; +} + + + +/* void gdImageFilledPolygon(gdImagePtr im, gdPointPtr points, + int pointsTotal, int color) + Changed to: gd.filledPolygon(im, { { x1, y1 }, { x2, y2 } ... }, color) */ +static int LgdImageFilledPolygon(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + gdPoint *plist; + int size; + int c; + + c = luaL_checkinteger(L, 3); + lua_remove(L, 3); /* Get and drop color */ + lua_remove(L, 1); /* Drop image from the stack */ + + plist = getPointList(L, &size); + gdImageFilledPolygon(im, plist, size, c); + free(plist); + return 0; +} + + +/* void gdImageOpenPolygon(gdImagePtr im, gdPointPtr points, + int pointsTotal, int color) + Changed to: gd.openPolygon(im, { { x1, y1 }, { x2, y2 } ... }, color) */ +static int LgdImageOpenPolygon(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + gdPoint *plist; + int size; + int c; + + c = luaL_checkinteger(L, 3); + lua_remove(L, 3); /* Get and drop color */ + lua_remove(L, 1); /* Drop image from the stack */ + + plist = getPointList(L, &size); + gdImageOpenPolygon(im, plist, size, c); + free(plist); + return 0; +} + + + +/* void gdImageArc(gdImagePtr im, int cx, int cy, int w, int h, int s, int e, + int color) */ +static int LgdImageArc(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int cx = luaL_checkinteger(L, 2); + int cy = luaL_checkinteger(L, 3); + int w = luaL_checkinteger(L, 4); + int h = luaL_checkinteger(L, 5); + int s = luaL_checkinteger(L, 6); + int e = luaL_checkinteger(L, 7); + int c = luaL_checkinteger(L, 8); + + gdImageArc(im, cx, cy, w, h, s, e, c); + return 0; +} + + +/* void gdImageFilledArc(gdImagePtr im, int cx, int cy, int w, int h, + int s, int e, int color, int style) */ +static int LgdImageFilledArc(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int cx = luaL_checkinteger(L, 2); + int cy = luaL_checkinteger(L, 3); + int w = luaL_checkinteger(L, 4); + int h = luaL_checkinteger(L, 5); + int s = luaL_checkinteger(L, 6); + int e = luaL_checkinteger(L, 7); + int c = luaL_checkinteger(L, 8); + int sty = luaL_checkinteger(L, 9); + + gdImageFilledArc(im, cx, cy, w, h, s, e, c, sty); + return 0; +} + + +/* void gdImageFilledEllipse(gdImagePtr im, int cx, int cy, int w, int h, + int color) */ +static int LgdImageFilledEllipse(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int cx = luaL_checkinteger(L, 2); + int cy = luaL_checkinteger(L, 3); + int w = luaL_checkinteger(L, 4); + int h = luaL_checkinteger(L, 5); + int c = luaL_checkinteger(L, 6); + + gdImageFilledEllipse(im, cx, cy, w, h, c); + return 0; +} + + +/* void gdImageFill(gdImagePtr im, int x, int y, int color) */ +static int LgdImageFill(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int x = luaL_checkinteger(L, 2); + int y = luaL_checkinteger(L, 3); + int c = luaL_checkinteger(L, 4); + + gdImageFill(im, x, y, c); + return 0; +} + + +/* void gdImageFillToBorder(gdImagePtr im, int x, int y, int border, + int color) */ +static int LgdImageFillToBorder(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int x = luaL_checkinteger(L, 2); + int y = luaL_checkinteger(L, 3); + int b = luaL_checkinteger(L, 4); + int c = luaL_checkinteger(L, 5); + + gdImageFillToBorder(im, x, y, b, c); + return 0; +} + + +/* void gdImageSetAntiAliased(gdImagePtr im, int c) */ +static int LgdImageSetAntiAliased(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int c = luaL_checkinteger(L, 2); + + gdImageSetAntiAliased(im, c); + return 0; +} + + +/* void gdImageSetAntiAliasedDontBlend(gdImagePtr im, int c) */ +static int LgdImageSetAntiAliasedDontBlend(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int c = luaL_checkinteger(L, 2); + + gdImageSetAntiAliasedDontBlend(im, c, 1); + return 0; +} + + +/* void gdImageSetBrush(gdImagePtr im, gdImagePtr brush) */ +static int LgdImageSetBrush(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + gdImagePtr b = getImagePtr(L, 2); + + gdImageSetBrush(im, b); + return 0; +} + + +/* void gdImageSetTile(gdImagePtr im, gdImagePtr tile) */ +static int LgdImageSetTile(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + gdImagePtr t = getImagePtr(L, 1); + + gdImageSetTile(im, t); + return 0; +} + + +/* void gdImageSetStyle(gdImagePtr im, int *style, int styleLength) */ +/* Changed To: gd.setStyle(im, { c1, c2, c3, ... } ) */ +static int LgdImageSetStyle(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int *slist; + int size; + int i; + + /* Stack: Im, T */ + luaL_checktype(L, -1, LUA_TTABLE); + size = lua_rawlen(L, -1); + slist = (int*) malloc(size * sizeof(int)); + + for (i = 0; i < size; i++) { + /* Stack: Im, T */ + lua_rawgeti(L, 2, i + 1); + + /* Stack: Im, T, num */ + if (lua_type(L, -1) != LUA_TNUMBER) { + free(slist); + typerror(L, -1, "Number"); + } + + slist[i] = luaL_checkinteger(L, -1); + lua_remove(L, -1); + + /* Stack: Im, T */ + } + + gdImageSetStyle(im, slist, size); + free(slist); + return 0; +} + + +/* void gdImageSetThickness(gdImagePtr im, int thickness) */ +static int LgdImageSetThickness(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int t = luaL_checkinteger(L, 2); + + gdImageSetThickness(im, t); + return 0; +} + + +/* void gdImageAlphaBlending(gdImagePtr im, int blending) */ +/* Changed to: im:alphaBlending(true_or_false) */ +static int LgdImageAlphaBlending(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int b = lua_toboolean(L, 2); + + gdImageAlphaBlending(im, b); + return 0; +} + + +/* void gdImageSaveAlpha(gdImagePtr im, int saveFlag) */ +/* Changed to: im:saveAlpha(true_or_false) */ +static int LgdImageSaveAlpha(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int b = lua_toboolean(L, 2); + + gdImageSaveAlpha(im, b); + return 0; +} + + +/* gdImageInterlace(gdImagePtr im, int interlace) */ +/* Changed to: im:interlace(true_or_false) */ +static int LgdImageInterlace(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int i = lua_toboolean(L, 2); + + gdImageInterlace(im, i); + return 0; +} + + +/* void gdImageString(gdImagePtr im, gdFontPtr font, int x, int y, + unsigned char *s, int color) */ +static int LgdImageString(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + gdFontPtr fnt = getStdFont(L, 2); + int x = luaL_checkinteger(L, 3); + int y = luaL_checkinteger(L, 4); + unsigned char *str = (unsigned char*) luaL_checkstring(L, 5); + int c = luaL_checkinteger(L, 6); + + gdImageString(im, fnt, x, y, str, c); + return 0; +} + + +/* void gdImageStringUp(gdImagePtr im, gdFontPtr font, int x, int y, + unsigned char *s, int color) */ +static int LgdImageStringUp(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + gdFontPtr fnt = getStdFont(L, 2); + int x = luaL_checkinteger(L, 3); + int y = luaL_checkinteger(L, 4); + unsigned char *str = (unsigned char*) luaL_checkstring(L, 5); + int c = luaL_checkinteger(L, 6); + + gdImageStringUp(im, fnt, x, y, str, c); + return 0; +} + + +/* void gdImageChar(gdImagePtr im, gdFontPtr font, int x, int y, + int c, int color) */ +/* Useless? */ +static int LgdImageChar(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + gdFontPtr fnt = getStdFont(L, 2); + int x = luaL_checkinteger(L, 3); + int y = luaL_checkinteger(L, 4); + char *str = (char*) luaL_checkstring(L, 5); + int c = luaL_checkinteger(L, 6); + int chr; + + if (str) { + chr = (int) str[0]; + } else { + typerror(L, 5, "string"); + return 0; + } + + gdImageChar(im, fnt, x, y, chr, c); + return 0; +} + + +/* void gdImageCharUp(gdImagePtr im, gdFontPtr font, int x, int y, + int c, int color) */ +static int LgdImageCharUp(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + gdFontPtr fnt = getStdFont(L, 2); + int x = luaL_checkinteger(L, 3); + int y = luaL_checkinteger(L, 4); + char *str = (char*) luaL_checkstring(L, 5); + int c = luaL_checkinteger(L, 6); + int chr; + + if (str) + chr = (int) str[0]; + else { + typerror(L, 5, "string"); + return 0; + } + + gdImageCharUp(im, fnt, x, y, chr, c); + return 0; +} + + +/* void gdImageCopy(gdImagePtr dst, gdImagePtr src, int dstX, int dstY, + int srcX, int srcY, int w, int h) */ +static int LgdImageCopy(lua_State *L) { + gdImagePtr dst = getImagePtr(L, 1); + gdImagePtr src = getImagePtr(L, 2); + int dstX = luaL_checkinteger(L, 3); + int dstY = luaL_checkinteger(L, 4); + int srcX = luaL_checkinteger(L, 5); + int srcY = luaL_checkinteger(L, 6); + int w = luaL_checkinteger(L, 7); + int h = luaL_checkinteger(L, 8); + + gdImageCopy(dst, src, dstX, dstY, srcX, srcY, w, h); + return 0; +} + + + +/* void gdImageCopyResized(gdImagePtr dst, gdImagePtr src, int dstX, + int dstY, int srcX, int srcY, int destW, int destH, + int srcW, int srcH) */ +static int LgdImageCopyResized(lua_State *L) { + gdImagePtr dst = getImagePtr(L, 1); + gdImagePtr src = getImagePtr(L, 2); + int dstX = luaL_checkinteger(L, 3); + int dstY = luaL_checkinteger(L, 4); + int srcX = luaL_checkinteger(L, 5); + int srcY = luaL_checkinteger(L, 6); + int dstW = luaL_checkinteger(L, 7); + int dstH = luaL_checkinteger(L, 8); + int srcW = luaL_checkinteger(L, 9); + int srcH = luaL_checkinteger(L, 10); + + gdImageCopyResized(dst, src, dstX, dstY, srcX, srcY, dstW, dstH, + srcW, srcH); + return 0; +} + + +/* void gdImageCopyResampled(gdImagePtr dst, gdImagePtr src, int dstX, + int dstY, int srcX, int srcY, int destW, int destH, int srcW, + int srcH) */ +static int LgdImageCopyResampled(lua_State *L) { + gdImagePtr dst = getImagePtr(L, 1); + gdImagePtr src = getImagePtr(L, 2); + int dstX = luaL_checkinteger(L, 3); + int dstY = luaL_checkinteger(L, 4); + int srcX = luaL_checkinteger(L, 5); + int srcY = luaL_checkinteger(L, 6); + int dstW = luaL_checkinteger(L, 7); + int dstH = luaL_checkinteger(L, 8); + int srcW = luaL_checkinteger(L, 9); + int srcH = luaL_checkinteger(L, 10); + + gdImageCopyResampled(dst, src, dstX, dstY, srcX, srcY, dstW, dstH, + srcW, srcH); + return 0; +} + + +/* void gdImageCopyRotated(gdImagePtr dst, gdImagePtr src, double dstX, + double dstY, int srcX, int srcY, int srcW, int srcH, int angle) */ +static int LgdImageCopyRotated(lua_State *L) { + gdImagePtr dst = getImagePtr(L, 1); + gdImagePtr src = getImagePtr(L, 2); + double dstX = (double) lua_tonumber(L, 3); + double dstY = (double) lua_tonumber(L, 4); + int srcX = luaL_checkinteger(L, 5); + int srcY = luaL_checkinteger(L, 6); + int srcW = luaL_checkinteger(L, 7); + int srcH = luaL_checkinteger(L, 8); + int ang = luaL_checkinteger(L, 9); + + gdImageCopyRotated(dst, src, dstX, dstY, srcX, srcY, srcW, srcH, ang); + return 0; +} + + +/* void gdImageCopyMerge(gdImagePtr dst, gdImagePtr src, int dstX, + int dstY, int srcX, int srcY, int w, int h, int pct) */ +static int LgdImageCopyMerge(lua_State *L) { + gdImagePtr dst = getImagePtr(L, 1); + gdImagePtr src = getImagePtr(L, 2); + int dstX = luaL_checkinteger(L, 3); + int dstY = luaL_checkinteger(L, 4); + int srcX = luaL_checkinteger(L, 5); + int srcY = luaL_checkinteger(L, 6); + int w = luaL_checkinteger(L, 7); + int h = luaL_checkinteger(L, 8); + int pct = luaL_checkinteger(L, 9); + + gdImageCopyMerge(dst, src, dstX, dstY, srcX, srcY, w, h, pct); + return 0; +} + + +/* void gdImageCopyMergeGray(gdImagePtr dst, gdImagePtr src, int dstX, + int dstY, int srcX, int srcY, int w, int h, int pct) */ +static int LgdImageCopyMergeGray(lua_State *L) { + gdImagePtr dst = getImagePtr(L, 1); + gdImagePtr src = getImagePtr(L, 2); + int dstX = luaL_checkinteger(L, 3); + int dstY = luaL_checkinteger(L, 4); + int srcX = luaL_checkinteger(L, 5); + int srcY = luaL_checkinteger(L, 6); + int w = luaL_checkinteger(L, 7); + int h = luaL_checkinteger(L, 8); + int pct = luaL_checkinteger(L, 9); + + gdImageCopyMergeGray(dst, src, dstX, dstY, srcX, srcY, w, h, pct); + return 0; +} + + +/* void gdImagePaletteCopy(gdImagePtr dst, gdImagePtr src) */ +static int LgdImagePaletteCopy(lua_State *L) { + gdImagePtr dst = getImagePtr(L, 1); + gdImagePtr src = getImagePtr(L, 2); + + gdImagePaletteCopy(dst, src); + return 0; +} + + +/* void gdImageSquareToCircle(gdImagePtr im, int radius) */ +static int LgdImageSquareToCircle(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int r = luaL_checkinteger(L, 2); + + gdImageSquareToCircle(im, r); + return 0; +} + + +/* void gdImageSharpen(gdImagePtr im, int pct) */ +static int LgdImageSharpen(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int pct = luaL_checkinteger(L, 2); + + gdImageSharpen(im, pct); + return 0; +} + + +/* void gdImageSetClip(gdImagePtr im, int x1, int y1, int x2, int y2) */ +static int LgdImageSetClip(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int x1 = luaL_checkinteger(L, 2); + int y1 = luaL_checkinteger(L, 3); + int x2 = luaL_checkinteger(L, 4); + int y2 = luaL_checkinteger(L, 5); + + gdImageSetClip(im, x1, y1, x2, y2); + return 0; +} + + +/* void gdImageGetClip(gdImagePtr im, int *x1, int *y1, int *x2, int *y2) */ +/* Changed to: x1p, y1p, x2p, y2p = im:getClip() */ +static int LgdImageGetClip(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int x1 = 0, y1 = 0, x2 = 0, y2 = 0; + + gdImageGetClip(im, &x1, &y1, &x2, &y2); + lua_pushnumber(L, x1); + lua_pushnumber(L, y1); + lua_pushnumber(L, x2); + lua_pushnumber(L, y2); + return 4; +} + + +#ifdef GD_FONTCONFIG +/* int gdFTUseFontConfig(int flag) */ +/* Changed to: gd.useFontConfig(true_or_false) */ +static int LgdFTUseFontConfig(lua_State *L) { + int b = lua_toboolean(L, 1); + lua_pushboolean(L, gdFTUseFontConfig(b)); + return 1; +} +#endif + + +#ifdef GD_FREETYPE +/* int gdFontCacheSetup(void) */ +static int LgdFontCacheSetup(lua_State *L) { + lua_pushboolean(L, !gdFontCacheSetup()); + return 1; +} + + +/* void gdFontCacheShutdown(void) */ +static int LgdFontCacheShutdown(lua_State *L) { + gdFontCacheShutdown(); + return 0; +} +#endif + + +/* char *gdImageStringFT(gdImagePtr im, int *brect, int fg, char *fontname, + double ptsize, double angle, int x, int y, char *string) + + Changed To: + llX, llY, lrX, lrY, urX, urY, ulX, ulY = im:stringFT(fg, fontname, + ptsize, angle, x, y, string) + + Or (to get the points only): + llX, llY, lrX, lrY, urX, urY, ulX, ulY = gd.stringFT(nil, fg, + fontname, ptsize, angle, x, y, string) +*/ + +#ifdef GD_FREETYPE +static int LgdImageStringFT(lua_State *L) { + gdImagePtr im; + int fg = luaL_checkinteger(L, 2); + char *font = (char*) luaL_checkstring(L, 3); + double size = (double) lua_tonumber(L, 4); + double ang = (double) lua_tonumber(L, 5); + int x = luaL_checkinteger(L, 6); + int y = luaL_checkinteger(L, 7); + char *str = (char*) luaL_checkstring(L, 8); + int brect[8]; + + if (lua_isnil(L, 1)) + im = NULL; + else + im = getImagePtr(L, 1); + + if (gdImageStringFT(im, brect, fg, font, size, ang, x, y, str) == NULL) { + lua_pushnumber(L, brect[0]); + lua_pushnumber(L, brect[1]); + lua_pushnumber(L, brect[2]); + lua_pushnumber(L, brect[3]); + lua_pushnumber(L, brect[4]); + lua_pushnumber(L, brect[5]); + lua_pushnumber(L, brect[6]); + lua_pushnumber(L, brect[7]); + return 8; + } + + lua_pushnil(L); + return 1; +} + + +/* char *gdImageStringFT(gdImagePtr im, int *brect, int fg, char *fontname, + double ptsize, double angle, int x, int y, char *string) + + Changed To: + llX, llY, lrX, lrY, urX, urY, ulX, ulY [, xshow] [, fontpath] = + im:stringFTEx(fg, fontname, ptsize, angle, x, y, string, { ... }) + + Or: + llX, llY, lrX, lrY, urX, urY, ulX, ulY [, xshow] [, fontpath] = + gd.stringFTEx(nil, fg, fontname, ptsize, angle, x, y, string, { ... }) + +*/ + +static int LgdImageStringFTEx(lua_State *L) { + gdImagePtr im; + int fg = luaL_checkinteger(L, 2); + char *font = (char*) luaL_checkstring(L, 3); + double size = (double) lua_tonumber(L, 4); + double ang = (double) lua_tonumber(L, 5); + int x = luaL_checkinteger(L, 6); + int y = luaL_checkinteger(L, 7); + char *str = (char*) luaL_checkstring(L, 8); + gdFTStringExtra *ex = getFTStringExtraPtr(L, 9); + int brect[8]; + int ret = 8; + + if (lua_isnil(L, 1)) + im = NULL; + else + im = getImagePtr(L, 1); + + if (gdImageStringFTEx(im, brect, fg, font, size, ang, x, y, str, ex) == NULL) { + lua_pushnumber(L, brect[0]); + lua_pushnumber(L, brect[1]); + lua_pushnumber(L, brect[2]); + lua_pushnumber(L, brect[3]); + lua_pushnumber(L, brect[4]); + lua_pushnumber(L, brect[5]); + lua_pushnumber(L, brect[6]); + lua_pushnumber(L, brect[7]); + ret = 8; + if (ex->flags & gdFTEX_XSHOW) { + lua_pushstring(L, ex->xshow); + gdFree(ex->xshow); + ret++; + } + if (ex->flags & gdFTEX_RETURNFONTPATHNAME) { + lua_pushstring(L, ex->fontpath); + gdFree(ex->fontpath); + ret++; + } + + free(ex); + return ret; + } + + lua_pushnil(L); + return 1; +} + + + +/* char *gdImageStringFTCircle(gdImagePtr im, int cx, int cy, double radius, + double textRadius, double fillPortion, char *font, + double points, char *top, char *bottom, int fgcolor) + + Changed to: im:stringFTCircle(cx, cy, radius, textRadius, + fillPortion, fontname, points, top, bottom, color) +*/ + +static int LgdImageStringFTCircle(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int cx = luaL_checkinteger(L, 2); + int cy = luaL_checkinteger(L, 3); + double radius = (double) lua_tonumber(L, 4); + double textRadius = (double) lua_tonumber(L, 5); + double fillPortion = (double) lua_tonumber(L, 6); + char *font = (char*) luaL_checkstring(L, 7); + double points = (double) lua_tonumber(L, 8); + char *top = (char*) luaL_checkstring(L, 9); + char *bottom = (char*) luaL_checkstring(L, 10); + int color = luaL_checkinteger(L, 11); + + if (gdImageStringFTCircle(im, cx, cy, radius, textRadius, fillPortion, + font, points, top, bottom, color)) + lua_pushboolean(L, 0); /* Error */ + else + lua_pushboolean(L, 1); + return 1; +} +#endif + + +#ifdef GD_GIF +/* void gdImageGifAnimBegin(gdImagePtr im, FILE *out, int GlobalCM, int Loops) + Changed to: im:gifAnimBegin(filename, globalCM, loops) +*/ + +static int LgdImageGifAnimBegin(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + const char *fname = luaL_checkstring(L, 2); + int globalCM = lua_toboolean(L, 3); + int loops = luaL_checkinteger(L, 4); + FILE *fp; + + if ((fp = fopen(fname, "wb")) == NULL) { + lua_pushboolean(L, 0); /* Error */ + return 1; + } + + gdImageGifAnimBegin(im, fp, globalCM, loops); + fclose(fp); + lua_pushboolean(L, 1); /* ok */ + return 1; +} + + +/* void gdImageGifAnimAdd(gdImagePtr im, FILE *out, int LocalCM, int LeftOfs, + int TopOfs, int Delay, int Disposal, gdImagePtr previm) + Changed to: im:gifAnimAdd(filename, localCM, leftOfs, topOfs, delay, + disposal [, previm]) +*/ + +static int LgdImageGifAnimAdd(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + const char *fname = luaL_checkstring(L, 2); + int localCM = lua_toboolean(L, 3); + int leftOfs = luaL_checkinteger(L, 4); + int topOfs = luaL_checkinteger(L, 5); + int delay = luaL_checkinteger(L, 6); + int disp = luaL_checkinteger(L, 7); + gdImagePtr previm = NULL; + FILE *fp; + + if (lua_gettop(L) >= 8) + previm = getImagePtr(L, 8); + + if ((fp = fopen(fname, "ab")) == NULL) { + lua_pushboolean(L, 0); /* Error */ + return 1; + } + + gdImageGifAnimAdd(im, fp, localCM, leftOfs, topOfs, delay, disp, previm); + fclose(fp); + lua_pushboolean(L, 1); /* ok */ + return 1; +} + + +/* void gdImageGifAnimEnd(FILE *out) + Changed to: gd.gifAnimEnd(filename) +*/ + +static int LgdImageGifAnimEnd(lua_State *L) { + const char *fname = luaL_checkstring(L, 1); + FILE *fp; + + if ((fp = fopen(fname, "ab")) == NULL) { + lua_pushboolean(L, 0); /* Error */ + return 1; + } + + gdImageGifAnimEnd(fp); + fclose(fp); + lua_pushboolean(L, 1); /* ok */ + return 1; +} + + +/* void* gdImageGifAnimBeginPtr(gdImagePtr im, int *size, int GlobalCM, + int Loops) + Changed to: im:gifAnimBeginStr(globalCM, loops) +*/ + +static int LgdImageGifAnimBeginPtr(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int globalCM = lua_toboolean(L, 2); + int loops = luaL_checkinteger(L, 3); + char *str; + int size; + + str = gdImageGifAnimBeginPtr(im, &size, globalCM, loops); + if (str != NULL) { + lua_pushlstring(L, str, size); + gdFree(str); + } else + lua_pushnil(L); + return 1; +} + + +/* void* gdImageGifAnimAddPtr(gdImagePtr im, int *size, int LocalCM, + int LeftOfs, int TopOfs, int Delay, int Disposal, gdImagePtr previm) + + Changed to: im:gifAnimAddStr(localCM, leftOfs, topOfs, delay, + disposal [, previm]) +*/ + +static int LgdImageGifAnimAddPtr(lua_State *L) { + gdImagePtr im = getImagePtr(L, 1); + int localCM = lua_toboolean(L, 2); + int leftOfs = luaL_checkinteger(L, 3); + int topOfs = luaL_checkinteger(L, 4); + int delay = luaL_checkinteger(L, 5); + int disp = luaL_checkinteger(L, 6); + gdImagePtr previm = NULL; + int size; + char *str; + + if (lua_gettop(L) >= 7) + previm = getImagePtr(L, 7); + + str = gdImageGifAnimAddPtr(im, &size, localCM, leftOfs, topOfs, delay, + disp, previm); + if (str != NULL) { + lua_pushlstring(L, str, size); + gdFree(str); + } else + lua_pushnil(L); + return 1; +} + + +/* void* gdImageGifAnimEndPtr(int *size) + Changed to: gd.gifAnimEndStr() +*/ + +static int LgdImageGifAnimEndPtr(lua_State *L) { + int size; + char *str; + + str = gdImageGifAnimEndPtr(&size); + if (str != NULL) { + lua_pushlstring(L, str, size); + gdFree(str); + } else + lua_pushnil(L); + return 1; +} + +#endif + + + +static const luaL_Reg LgdFunctions[] = +{ +/* Leave Lua do it! + { "destroy", LgdImageDestroy }, */ + + { "create", LgdImageCreate }, + { "createPalette", LgdImageCreatePalette }, + { "createTrueColor", LgdImageCreateTrueColor }, + { "createPaletteFromTrueColor", LgdImageCreatePaletteFromTrueColor }, + { "trueColorToPalette", LgdImageTrueColorToPalette }, + +#ifdef GD_JPEG + { "createFromJpeg", LgdImageCreateFromJpeg }, + { "createFromJpegStr", LgdImageCreateFromJpegPtr }, +#endif +#ifdef GD_GIF + { "createFromGif", LgdImageCreateFromGif }, + { "createFromGifStr", LgdImageCreateFromGifPtr }, +#endif + { "createFromPng", LgdImageCreateFromPng }, + { "createFromPngStr", LgdImageCreateFromPngPtr }, + { "createFromGd", LgdImageCreateFromGd }, + { "createFromGdStr", LgdImageCreateFromGdPtr }, + { "createFromGd2", LgdImageCreateFromGd2 }, + { "createFromGd2Str", LgdImageCreateFromGd2Ptr }, + { "createFromGd2Part", LgdImageCreateFromGd2Part }, + { "createFromGd2PartStr", LgdImageCreateFromGd2PartPtr }, + +#ifdef GD_XPM + { "createFromXbm", LgdImageCreateFromXbm }, + { "createFromXpm", LgdImageCreateFromXpm }, +#endif + +#ifdef GD_JPEG + { "jpeg", LgdImageJpeg }, + { "jpegStr", LgdImageJpegPtr }, +#endif +#ifdef GD_PNG + { "png", LgdImagePng }, + { "pngStr", LgdImagePngPtr }, + { "pngEx", LgdImagePngEx }, + { "pngStrEx", LgdImagePngPtrEx }, +#endif +#ifdef GD_GIF + { "gif", LgdImageGif }, + { "gifStr", LgdImageGifPtr }, +#endif + { "gd", LgdImageGd }, + { "gdStr", LgdImageGdPtr }, + { "gd2", LgdImageGd2 }, + { "gd2Str", LgdImageGd2Ptr }, + { "wbmp", LgdImageWBMP }, + { "wbmpStr", LgdImageWBMPPtr }, + + { "colorAllocate", LgdImageColorAllocate }, + { "colorAllocateAlpha", LgdImageColorAllocateAlpha }, + { "colorClosest", LgdImageColorClosest }, + { "colorClosestAlpha", LgdImageColorClosestAlpha }, + { "colorClosestHWB", LgdImageColorClosestHWB }, + { "colorExact", LgdImageColorExact }, + { "colorExactAlpha", LgdImageColorExactAlpha }, + { "colorResolve", LgdImageColorResolve }, + { "colorResolveAlpha", LgdImageColorResolveAlpha }, + { "colorsTotal", LgdImageColorsTotal }, + { "red", LgdImageRed }, + { "blue", LgdImageBlue }, + { "green", LgdImageGreen }, + { "alpha", LgdImageAlpha }, + { "getTransparent", LgdImageGetTransparent }, + { "colorTransparent", LgdImageColorTransparent }, + { "colorDeallocate", LgdImageColorDeallocate }, + + { "boundsSafe", LgdImageBoundsSafe }, + { "getPixel", LgdImageGetPixel }, + { "sizeX", LgdImageSX }, + { "sizeY", LgdImageSY }, + { "sizeXY", LgdImageSXY }, + { "getClip", LgdImageGetClip }, + { "setClip", LgdImageSetClip }, + + { "setPixel", LgdImageSetPixel }, + { "line", LgdImageLine }, + { "rectangle", LgdImageRectangle }, + { "filledRectangle", LgdImageFilledRectangle }, + { "polygon", LgdImagePolygon }, + { "filledPolygon", LgdImageFilledPolygon }, + { "openPolygon", LgdImageOpenPolygon }, + { "arc", LgdImageArc }, + { "filledArc", LgdImageFilledArc }, + { "filledEllipse", LgdImageFilledEllipse }, + { "fill", LgdImageFill }, + { "fillToBorder", LgdImageFillToBorder }, + + { "setAntiAliased", LgdImageSetAntiAliased }, + { "setAntiAliasedDontBlend", LgdImageSetAntiAliasedDontBlend }, + { "setBrush", LgdImageSetBrush }, + { "setTile", LgdImageSetTile }, + { "setStyle", LgdImageSetStyle }, + { "setThickness", LgdImageSetThickness }, + { "alphaBlending", LgdImageAlphaBlending }, + { "saveAlpha", LgdImageSaveAlpha }, + { "getInterlaced", LgdImageGetInterlaced }, + { "interlace", LgdImageInterlace }, + + { "string", LgdImageString }, + { "stringUp", LgdImageStringUp }, + { "char", LgdImageChar }, + { "charUp", LgdImageCharUp }, + + { "copy", LgdImageCopy }, + { "copyResized", LgdImageCopyResized }, + { "copyResampled", LgdImageCopyResampled }, + { "copyRotated", LgdImageCopyRotated }, + { "copyMerge", LgdImageCopyMerge }, + { "copyMergeGray", LgdImageCopyMergeGray }, + { "paletteCopy", LgdImagePaletteCopy }, + { "squareToCircle", LgdImageSquareToCircle }, + { "sharpen", LgdImageSharpen }, + +#ifdef GD_FREETYPE + { "stringFT", LgdImageStringFT }, + { "stringFTEx", LgdImageStringFTEx }, + { "stringFTCircle", LgdImageStringFTCircle }, + { "fontCacheSetup", LgdFontCacheSetup }, + { "fontCacheShutdown", LgdFontCacheShutdown }, +#endif + +#ifdef GD_FONTCONFIG + { "useFontConfig", LgdFTUseFontConfig }, +#endif + +#ifdef GD_GIF /* Gif animation */ + { "gifAnimBegin", LgdImageGifAnimBegin }, + { "gifAnimAdd", LgdImageGifAnimAdd }, + { "gifAnimEnd", LgdImageGifAnimEnd }, + { "gifAnimBeginStr", LgdImageGifAnimBeginPtr }, + { "gifAnimAddStr", LgdImageGifAnimAddPtr }, + { "gifAnimEndStr", LgdImageGifAnimEndPtr }, +#endif + + { NULL, NULL } +}; + + +static const luaL_Reg LgdMetatable[] = +{ + { "__gc", LgdImageDestroy }, + { NULL, NULL } +}; + + +int luaopen_gd(lua_State *L) { + lua_newtable(L); + luaL_setfuncs(L, LgdFunctions, 0); + + lua_pushliteral(L, "VERSION"); + lua_pushstring(L, LIB_VERSION); + lua_settable(L, -3); + + lua_pushliteral(L, "COPYRIGHT"); + lua_pushstring(L, LIB_COPYRIGHT); + lua_settable(L, -3); + + tblseticons(L, "MAX_COLORS", gdMaxColors); + tblseticons(L, "GD2_FMT_RAW", GD2_FMT_RAW); + tblseticons(L, "GD2_FMT_COMPRESSED", GD2_FMT_COMPRESSED); + tblseticons(L, "ARC", gdArc); + tblseticons(L, "CHORD", gdChord); + tblseticons(L, "PIE", gdPie); + tblseticons(L, "NO_FILL", gdNoFill); + tblseticons(L, "EDGED", gdEdged); + tblseticons(L, "ANTI_ALIASED", gdAntiAliased); + tblseticons(L, "BRUSHED", gdBrushed); + tblseticons(L, "STYLED", gdStyled); + tblseticons(L, "STYLED_BRUSHED", gdStyledBrushed); + tblseticons(L, "TILED", gdTiled); + tblseticons(L, "TRANSPARENT", gdTransparent); + +#ifdef GD_FREETYPE + /* For gd.StringFTEx */ + tblseticons(L, "FTEX_Unicode", gdFTEX_Unicode); + tblseticons(L, "FTEX_Shift_JIS", gdFTEX_Shift_JIS); + tblseticons(L, "FTEX_Big5", gdFTEX_Big5); +#endif + +#ifdef GD_GIF + /* For gif animation */ + tblseticons(L, "DISPOSAL_NONE", gdDisposalNone); + tblseticons(L, "DISPOSAL_UNKNOWN", gdDisposalUnknown); + tblseticons(L, "DISPOSAL_RESTORE_BACKGROUND", gdDisposalRestoreBackground); + tblseticons(L, "DISPOSAL_RESTORE_PREVIOUS", gdDisposalRestorePrevious); +#endif + + /* Standard gd fonts */ + tblseticons(L, "FONT_TINY", MY_GD_FONT_TINY); + tblseticons(L, "FONT_SMALL", MY_GD_FONT_SMALL); + tblseticons(L, "FONT_MEDIUM", MY_GD_FONT_MEDIUM_BOLD); + tblseticons(L, "FONT_LARGE", MY_GD_FONT_LARGE); + tblseticons(L, "FONT_GIANT", MY_GD_FONT_GIANT); + + luaL_newmetatable(L, GD_IMAGE_PTR_TYPENAME); + lua_pushliteral(L, "__index"); + lua_pushvalue(L, -3); + lua_settable(L, -3); + luaL_setfuncs(L, LgdMetatable, 0); + lua_pop(L, 1); + + return 1; +} + diff --git a/test_features.lua b/test_features.lua new file mode 100644 index 000000000..e6ae14d64 --- /dev/null +++ b/test_features.lua @@ -0,0 +1,24 @@ +#!/usr/bin/env lua + +local gd = require("gd") + +function enabled(res, desc) + local str = " " .. desc .. " " + str = str .. string.rep(".", 37 - string.len(str)) + if res then + print(str .. " Enabled") + else + print(str .. " Disabled") + end +end + +print("Lua-GD version: " .. gd.VERSION) +print("Lua-GD features:") + +enabled(gd.png, "PNG support") +enabled(gd.gif, "GIF support") +enabled(gd.jpeg, "JPEG support") +enabled(gd.createFromXpm, "XPM/XBM support") +enabled(gd.stringFT, "FreeType support") +enabled(gd.useFontConfig, "Fontconfig support") +