WIP - c integration for png output

This commit is contained in:
Justin Ethier 2016-04-18 22:52:44 -04:00
parent baa2be0bcf
commit 07eb9e7e2d
3 changed files with 86 additions and 48 deletions

View file

@ -7,16 +7,16 @@ META_FILES = $(addsuffix .meta, $(SCM_LIBS))
GENC_FILES = $(addsuffix .c, $(SCM_LIBS)) GENC_FILES = $(addsuffix .c, $(SCM_LIBS))
COBJECTS=$(SLD_FILES:.sld=.o) COBJECTS=$(SLD_FILES:.sld=.o)
all: $(SCM_PROGRAM) write-png all: $(SCM_PROGRAM) #write-png
%.o: %.sld %.o: %.sld
cyclone $< cyclone $<
$(SCM_PROGRAM): $(SCM_FILE) $(COBJECTS) $(SCM_PROGRAM): $(SCM_FILE) $(COBJECTS) write-png.o
cyclone $< cyclone $<
write-png: write-png.o #write-png: write-png.o
gcc -o write-png write-png.o -lpng # gcc -o write-png write-png.o -lpng
write-png.o: write-png.c write-png.h write-png.o: write-png.c write-png.h
gcc -c write-png.c gcc -c write-png.c

View file

@ -20,23 +20,30 @@
((3) #t) ((3) #t)
((2) (ref grid i j)) ((2) (ref grid i j))
(else #f))) (else #f)))
(define (clear-vt100) ; (define (clear-vt100)
(display ; (display
(string ; (string
(integer->char #x1B) ; (integer->char #x1B)
#\[ ; #\[
#\H ; #\H
(integer->char #x1B) ; (integer->char #x1B)
#\[ ; #\[
#\J))) ; #\J)))
(define (life-print grid) (define (life-print grid iteration)
(clear-vt100) ;(clear-vt100)
(each grid (let ((img (png:init 100 100))
(lambda (i j v) (path (string-append "life-" (number->string iteration) ".png")))
(display (if v "*" " ")) (each grid
(if (= j (- (cols grid) 1)) (lambda (i j v)
;(when (= j (- (cols grid) 1)) ;(display (if v "*" " "))
(newline))))) ;(when (= j (- (cols grid) 1))
; (newline))
(if v
(png:set! i j 0 250 0))
))
(png:save img path)
(png:free img)
))
(define (life grid iterations) (define (life grid iterations)
(do ((i 0 (+ i 1)) (do ((i 0 (+ i 1))
(grid0 grid grid1) (grid0 grid grid1)
@ -48,4 +55,35 @@
(let ((a (life-alive? grid0 j k))) (let ((a (life-alive? grid0 j k)))
(put! grid1 j k a)))) (put! grid1 j k a))))
;(set! grid1 j k a)))) ;(set! grid1 j k a))))
(life-print grid1))))) (life-print grid1 i)))
(define-c png:init
"(void *data, int argc, closure _, object width, object height)"
" RGBBitmap *img = malloc(sizeof(RGBBitmap));
make_c_opaque(opq, (void *)img);
bitmap_init(img, (int)(unbox_number(width)), (int)(unbox_number(height)));
return_closcall1(data, k, &opq);
")
(define-c png:free
"(void *data, int argc, closure _, object opq)"
" RGBBitmap *img = opaque_ptr(opq);
free(img->pixels);
free(img);
return_closcall1(data, k, boolean_t);
")
(define-c png:set!
"(void *data, int argc, closure _, object opq, object x, object y, object r, object g, object b)"
" RGBBitmap *img = opaque_ptr(opq);
bitmap_set(img,
((int)(unbox_number(x))),
((int)(unbox_number(y))),
((int)(unbox_number(r))),
((int)(unbox_number(g))),
((int)(unbox_number(b))));
return_closcall1(data, k, boolean_t); ")
(define-c png:save
"(void *data, int argc, closure _, object opq, object path)"
" RGBBitmap *img = opaque_ptr(opq);
bitmap_save_to_png(img, string_str(path));
return_closcall1(data, k, boolean_t);
")
))

View file

@ -96,29 +96,29 @@ int bitmap_set(RGBBitmap *img, int x, int y, int r, int g, int b)
return 0; return 0;
} }
int main() //int main()
{ //{
const char path[] = "test.png"; // const char path[] = "test.png";
int status = 0, x, y; // int status = 0, x, y;
RGBBitmap img; // RGBBitmap img;
//
bitmap_init(&img, 100, 100); // bitmap_init(&img, 100, 100);
for (y = 0; y < img.height; y++) { // for (y = 0; y < img.height; y++) {
for (x = 0; x < img.height; x++) { // for (x = 0; x < img.height; x++) {
bitmap_set(&img, x, y, 255, 255, 255); // bitmap_set(&img, x, y, 255, 255, 255);
} // }
} // }
bitmap_set(&img, 50, 50, 0, 0, 255); // bitmap_set(&img, 50, 50, 0, 0, 255);
bitmap_set(&img, 0, 0, 0, 0, 255); // bitmap_set(&img, 0, 0, 0, 0, 255);
bitmap_set(&img, 99, 0, 0, 0, 255); // bitmap_set(&img, 99, 0, 0, 0, 255);
bitmap_set(&img, 0, 99, 0, 0, 255); // bitmap_set(&img, 0, 99, 0, 0, 255);
bitmap_set(&img, 99, 99, 0, 0, 255); // bitmap_set(&img, 99, 99, 0, 0, 255);
//
status = bitmap_save_to_png(&img, path); // status = bitmap_save_to_png(&img, path);
if (!status){ // if (!status){
printf("Successfully saved %s\n", path); // printf("Successfully saved %s\n", path);
} else { // } else {
printf("Unable to save %s\n", path); // printf("Unable to save %s\n", path);
} // }
return status; // return status;
} //}