summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/mfluadir/potrace/luafunc.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/mfluadir/potrace/luafunc.c')
-rw-r--r--Build/source/texk/web2c/mfluadir/potrace/luafunc.c108
1 files changed, 108 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/mfluadir/potrace/luafunc.c b/Build/source/texk/web2c/mfluadir/potrace/luafunc.c
new file mode 100644
index 00000000000..e8cb3ff6839
--- /dev/null
+++ b/Build/source/texk/web2c/mfluadir/potrace/luafunc.c
@@ -0,0 +1,108 @@
+/* From potracelib_demo.c */
+
+#include "luafunc.h"
+
+
+
+/* ---------------------------------------------------------------------- */
+/* auxiliary bitmap functions */
+
+
+/* macros for writing individual bitmap pixels */
+#define BM_WORDSIZE ((int)sizeof(potrace_word))
+#define BM_WORDBITS (8*BM_WORDSIZE)
+#define BM_HIBIT (((potrace_word)1)<<(BM_WORDBITS-1))
+#define bm_scanline(bm, y) ((bm)->map + (y)*(bm)->dy)
+#define bm_index(bm, x, y) (&bm_scanline(bm, y)[(x)/BM_WORDBITS])
+#define bm_mask(x) (BM_HIBIT >> ((x) & (BM_WORDBITS-1)))
+#define bm_range(x, a) ((int)(x) >= 0 && (int)(x) < (a))
+#define bm_safe(bm, x, y) (bm_range(x, (bm)->w) && bm_range(y, (bm)->h))
+#define BM_USET(bm, x, y) (*bm_index(bm, x, y) |= bm_mask(x))
+#define BM_UCLR(bm, x, y) (*bm_index(bm, x, y) &= ~bm_mask(x))
+#define BM_UPUT(bm, x, y, b) ((b) ? BM_USET(bm, x, y) : BM_UCLR(bm, x, y))
+#define BM_PUT(bm, x, y, b) (bm_safe(bm, x, y) ? BM_UPUT(bm, x, y, b) : 0)
+
+/* return new un-initialized bitmap. NULL with errno on error */
+static potrace_bitmap_t *bm_new(int w, int h) {
+ potrace_bitmap_t *bm;
+ int dy = (w + BM_WORDBITS - 1) / BM_WORDBITS;
+
+ bm = (potrace_bitmap_t *) malloc(sizeof(potrace_bitmap_t));
+ if (!bm) {
+ return NULL;
+ }
+ bm->w = w;
+ bm->h = h;
+ bm->dy = dy;
+ bm->map = (potrace_word *) calloc(h, dy * BM_WORDSIZE);
+ if (!bm->map) {
+ free(bm);
+ return NULL;
+ }
+ return bm;
+}
+
+/* free a bitmap */
+static void bm_free(potrace_bitmap_t *bm) {
+ if (bm != NULL) {
+ free(bm->map);
+ }
+ free(bm);
+}
+
+//int potrace_getMFoutlines(const uint8_t *raster,int w, int h) {
+int potrace_getMFoutlines(const uint8_t *raster, int w, int h, MFoutlines_param_t opt_param,potrace_state_t **trace) {
+ int x, y;
+ potrace_bitmap_t *bm;
+ potrace_param_t *param;
+ potrace_state_t *st;
+ int W,X;
+ uint8_t data,pix;
+
+ /* create a bitmap */
+ bm = bm_new(w, h);
+ if (!bm) {
+ fprintf(stderr, "! Error allocating bitmap: %s\n", strerror(errno));
+ return 1;
+ }
+
+ /* fill the bitmap */
+ W= (w%8)==0 ?(w/8):(w/8+1);
+ for (y=0; y<h; y++) {
+ for (X=0;X<W; X++) {
+ data = raster[W*y+X];
+ pix = (data & (1<<7))==0 ? 0:1;x = 0+X*8;BM_PUT(bm, x, y, pix);
+ pix = (data & (1<<6))==0 ? 0:1;x = 1+X*8;BM_PUT(bm, x, y, pix);
+ pix = (data & (1<<5))==0 ? 0:1;x = 2+X*8;BM_PUT(bm, x, y, pix);
+ pix = (data & (1<<4))==0 ? 0:1;x = 3+X*8;BM_PUT(bm, x, y, pix);
+ pix = (data & (1<<3))==0 ? 0:1;x = 4+X*8;BM_PUT(bm, x, y, pix);
+ pix = (data & (1<<2))==0 ? 0:1;x = 5+X*8;BM_PUT(bm, x, y, pix);
+ pix = (data & (1<<1))==0 ? 0:1;x = 6+X*8;BM_PUT(bm, x, y, pix);
+ pix = (data & (1<<0))==0 ? 0:1;x = 7+X*8;BM_PUT(bm, x, y, pix);
+ }
+ }
+
+ /* set tracing parameters, starting from defaults */
+ if (opt_param.potrace_param == NULL) {
+ param = potrace_param_default();printf("opt_param.potrace_param == NULL\n");
+ if (!param) {
+ fprintf(stderr, "! Error allocating parameters: %s\n", strerror(errno));
+ return 1;
+ }
+ param->turdsize = 0;
+ } else {
+ param = opt_param.potrace_param;
+ }
+ /*printf("turdsize=%d;turnpolicy=%d;alphamax=%f;opticurve=%d;opttolerance=%f\n",param->turdsize,param->turnpolicy,param->alphamax,param->opticurve,param->opttolerance);*/
+
+ /* trace the bitmap */
+ st = potrace_trace(param, bm);
+ if (!st || st->status != POTRACE_STATUS_OK) {
+ fprintf(stderr, "! Error tracing bitmap: %s\n", strerror(errno));
+ bm_free(bm);
+ return 1;
+ }
+ bm_free(bm);
+ *trace = st ;
+ return 0;
+} \ No newline at end of file