summaryrefslogtreecommitdiff
path: root/usr/src/common/ficl/loader.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/common/ficl/loader.c')
-rw-r--r--usr/src/common/ficl/loader.c121
1 files changed, 121 insertions, 0 deletions
diff --git a/usr/src/common/ficl/loader.c b/usr/src/common/ficl/loader.c
index d581015c5c..a2172d11bb 100644
--- a/usr/src/common/ficl/loader.c
+++ b/usr/src/common/ficl/loader.c
@@ -43,6 +43,7 @@
#include <termios.h>
#else
#include <stand.h>
+#include <gfx_fb.h>
#include "bootstrap.h"
#endif
#ifdef _STANDALONE
@@ -69,6 +70,114 @@
* .# ( value -- )
*/
+#ifdef _STANDALONE
+void
+ficl_fb_putimage(ficlVm *pVM)
+{
+ char *namep, *name;
+ ficlUnsigned names;
+ ficlInteger ret = FICL_FALSE;
+ png_t png;
+
+ FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 2, 1);
+
+ names = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ namep = (char *)ficlStackPopPointer(ficlVmGetDataStack(pVM));
+
+ name = ficlMalloc(names+1);
+ if (!name)
+ ficlVmThrowError(pVM, "Error: out of memory");
+ strncpy(name, namep, names);
+ name[names] = '\0';
+
+ if (png_open(&png, name) != PNG_NO_ERROR) {
+ ret = FICL_FALSE;
+ ficlFree(name);
+ ficlStackPushInteger(ficlVmGetDataStack(pVM), ret);
+ return;
+ }
+
+ if (gfx_fb_putimage(&png) == 0)
+ ret = FICL_TRUE; /* success */
+ png_close(&png);
+ ficlFree(name);
+ ficlStackPushInteger(ficlVmGetDataStack(pVM), ret);
+}
+
+void
+ficl_fb_setpixel(ficlVm *pVM)
+{
+ ficlUnsigned x, y;
+
+ FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 2, 0);
+
+ y = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ x = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ gfx_fb_setpixel(x, y);
+}
+
+void
+ficl_fb_line(ficlVm *pVM)
+{
+ ficlUnsigned x0, y0, x1, y1, wd;
+
+ FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 5, 0);
+
+ wd = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ y1 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ x1 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ y0 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ x0 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ gfx_fb_line(x0, y0, x1, y1, wd);
+}
+
+void
+ficl_fb_bezier(ficlVm *pVM)
+{
+ ficlUnsigned x0, y0, x1, y1, x2, y2, width;
+
+ FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 7, 0);
+
+ width = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ y2 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ x2 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ y1 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ x1 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ y0 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ x0 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ gfx_fb_bezier(x0, y0, x1, y1, x2, y2, width);
+}
+
+void
+ficl_fb_drawrect(ficlVm *pVM)
+{
+ ficlUnsigned x1, x2, y1, y2, fill;
+
+ FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 5, 0);
+
+ fill = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ y2 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ x2 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ y1 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ x1 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ gfx_fb_drawrect(x1, y1, x2, y2, fill);
+}
+
+void
+ficl_term_drawrect(ficlVm *pVM)
+{
+ ficlUnsigned x1, x2, y1, y2;
+
+ FICL_STACK_CHECK(ficlVmGetDataStack(pVM), 4, 0);
+
+ y2 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ x2 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ y1 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ x1 = ficlStackPopUnsigned(ficlVmGetDataStack(pVM));
+ gfx_term_drawrect(x1, y1, x2, y2);
+}
+#endif /* _STANDALONE */
+
void
ficlSetenv(ficlVm *pVM)
{
@@ -915,6 +1024,18 @@ ficlSystemCompilePlatform(ficlSystem *pSys)
ficlDictionarySetPrimitive(dp, "uuid-to-string", ficlUuidToString,
FICL_WORD_DEFAULT);
#ifdef _STANDALONE
+ ficlDictionarySetPrimitive(dp, "fb-setpixel", ficl_fb_setpixel,
+ FICL_WORD_DEFAULT);
+ ficlDictionarySetPrimitive(dp, "fb-line", ficl_fb_line,
+ FICL_WORD_DEFAULT);
+ ficlDictionarySetPrimitive(dp, "fb-bezier", ficl_fb_bezier,
+ FICL_WORD_DEFAULT);
+ ficlDictionarySetPrimitive(dp, "fb-drawrect", ficl_fb_drawrect,
+ FICL_WORD_DEFAULT);
+ ficlDictionarySetPrimitive(dp, "fb-putimage", ficl_fb_putimage,
+ FICL_WORD_DEFAULT);
+ ficlDictionarySetPrimitive(dp, "term-drawrect", ficl_term_drawrect,
+ FICL_WORD_DEFAULT);
/* Register words from linker set. */
SET_FOREACH(fnpp, Xficl_compile_set)
(*fnpp)(pSys);