From ef58dfeb4a6c81ee2508935416dbefb7615a3065 Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Thu, 15 Jun 2023 14:12:41 -0400 Subject: Add image saveAsJpeg --- virtual-programs/images.folk | 59 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to 'virtual-programs') diff --git a/virtual-programs/images.folk b/virtual-programs/images.folk index e2af03af..5e9bdfac 100644 --- a/virtual-programs/images.folk +++ b/virtual-programs/images.folk @@ -23,6 +23,65 @@ namespace eval ::image { data [format 0x%x $subdata] } } + + set cc [c create] + $cc cflags -L[lindex [exec /usr/sbin/ldconfig -p | grep libjpeg] end] + defineImageType $cc + $cc include + $cc include + $cc include + + $cc code { + #include + #include + #include + + void + jpeg(FILE* dest, uint8_t* rgb, uint32_t width, uint32_t height, int quality) + { + JSAMPARRAY image; + image = calloc(height, sizeof (JSAMPROW)); + for (size_t i = 0; i < height; i++) { + image[i] = calloc(width * 3, sizeof (JSAMPLE)); + for (size_t j = 0; j < width; j++) { + image[i][j * 3 + 0] = rgb[(i * width + j)]; + image[i][j * 3 + 1] = rgb[(i * width + j)]; + image[i][j * 3 + 2] = rgb[(i * width + j)]; + } + } + + struct jpeg_compress_struct compress; + struct jpeg_error_mgr error; + compress.err = jpeg_std_error(&error); + jpeg_create_compress(&compress); + jpeg_stdio_dest(&compress, dest); + + compress.image_width = width; + compress.image_height = height; + compress.input_components = 3; + compress.in_color_space = JCS_RGB; + jpeg_set_defaults(&compress); + jpeg_set_quality(&compress, quality, TRUE); + jpeg_start_compress(&compress, TRUE); + jpeg_write_scanlines(&compress, image, height); + jpeg_finish_compress(&compress); + jpeg_destroy_compress(&compress); + + for (size_t i = 0; i < height; i++) { + free(image[i]); + } + free(image); + } + + } + $cc proc saveAsJpeg {image_t im char* filename} void { + FILE* out = fopen(filename, "w"); + jpeg(out, im.data, im.width, im.height, 100); + fclose(out); + } + c loadlib [lindex [exec /usr/sbin/ldconfig -p | grep libjpeg] end] + $cc compile + namespace export * namespace ensemble create } -- cgit v1.2.3 From 224d20c26f86467b683d538d5f55bc4399e2a570 Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Thu, 15 Jun 2023 14:34:48 -0400 Subject: Fix undef behavior in images.folk. Disable process log by default --- virtual-programs/images.folk | 1 + virtual-programs/process.folk | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'virtual-programs') diff --git a/virtual-programs/images.folk b/virtual-programs/images.folk index 5e9bdfac..0af567df 100644 --- a/virtual-programs/images.folk +++ b/virtual-programs/images.folk @@ -26,6 +26,7 @@ namespace eval ::image { set cc [c create] $cc cflags -L[lindex [exec /usr/sbin/ldconfig -p | grep libjpeg] end] + source "pi/cUtils.tcl" defineImageType $cc $cc include $cc include diff --git a/virtual-programs/process.folk b/virtual-programs/process.folk index c08659f1..d92d10c2 100644 --- a/virtual-programs/process.folk +++ b/virtual-programs/process.folk @@ -1,3 +1,3 @@ When /p/ is running process /process/ & process /process/ has standard output log /log/ { - Wish $p is labelled [join $log "\n"] + # Wish $p is labelled [join $log "\n"] } -- cgit v1.2.3 From 386526612e3895214df7b5969bf46419c2eb18db Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Fri, 16 Jun 2023 11:28:32 -0400 Subject: Load libjpeg on Darwin --- virtual-programs/images.folk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'virtual-programs') diff --git a/virtual-programs/images.folk b/virtual-programs/images.folk index 0af567df..b821f9b0 100644 --- a/virtual-programs/images.folk +++ b/virtual-programs/images.folk @@ -25,7 +25,7 @@ namespace eval ::image { } set cc [c create] - $cc cflags -L[lindex [exec /usr/sbin/ldconfig -p | grep libjpeg] end] + c loadlib [expr {$tcl_platform(os) eq "Darwin" ? "/opt/homebrew/lib/libjpeg.dylib" : [lindex [exec /usr/sbin/ldconfig -p | grep libjpeg] end]}] source "pi/cUtils.tcl" defineImageType $cc $cc include -- cgit v1.2.3 From 53c8466aabae78cb879241267a7431d5cf878a60 Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Fri, 16 Jun 2023 11:38:18 -0400 Subject: Fix camera slice on rotated systems like folk0? --- virtual-programs/images.folk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'virtual-programs') diff --git a/virtual-programs/images.folk b/virtual-programs/images.folk index b821f9b0..bf25e308 100644 --- a/virtual-programs/images.folk +++ b/virtual-programs/images.folk @@ -26,13 +26,14 @@ namespace eval ::image { set cc [c create] c loadlib [expr {$tcl_platform(os) eq "Darwin" ? "/opt/homebrew/lib/libjpeg.dylib" : [lindex [exec /usr/sbin/ldconfig -p | grep libjpeg] end]}] + $cc cflags -ljpeg source "pi/cUtils.tcl" defineImageType $cc $cc include $cc include - $cc include $cc code { + #undef EXTERN #include #include #include @@ -80,7 +81,6 @@ namespace eval ::image { jpeg(out, im.data, im.width, im.height, 100); fclose(out); } - c loadlib [lindex [exec /usr/sbin/ldconfig -p | grep libjpeg] end] $cc compile namespace export * @@ -98,8 +98,8 @@ When /someone/ wishes /p/ has camera slice & \ lassign [projectorToCamera [list $maxX $maxY]] px1 py1 # Clamp to image bounds - set x [expr {int(max($px0, 0))}] - set y [expr {int(max($py0, 0))}] + set x [expr {int(max(min($px0, $px1), 0))}] + set y [expr {int(max(min($py0, $py1), 0))}] set w [expr {int(min(abs($px1 - $px0), [image width $f]))}] set h [expr {int(min(abs($py1 - $py0), [image height $f]))}] -- cgit v1.2.3