diff options
Diffstat (limited to 'usr/src/common/ficl/loader.c')
-rw-r--r-- | usr/src/common/ficl/loader.c | 121 |
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); |