Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Jul 2012 19:25:24 GMT
From:      Brooks Davis <brooks@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 214917 for review
Message-ID:  <201207251925.q6PJPO2f068041@skunkworks.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@214917?ac=10

Change 214917 by brooks@brooks_ecr_current on 2012/07/25 19:24:28

	Add fbdumppng and fbloadpng commands which do what you would expect.
	Also add an fbfill command that fills the screen with a specified
	color.

Affected files ...

.. //depot/projects/ctsrd/beribsd/src/ctsrd/mtlctl/mtlctl.c#3 edit

Differences ...

==== //depot/projects/ctsrd/beribsd/src/ctsrd/mtlctl/mtlctl.c#3 (text+ko) ====

@@ -45,6 +45,7 @@
 #include <fnmatch.h>
 #include <libutil.h>
 #include <magic.h>
+#include <png.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -83,7 +84,10 @@
 	
 	printf("usage:	\n");
 	printf("	mtlclt fbdump <file>\n");
+	printf("	mtlclt fbdumppng <file>\n");
+	printf("	mtlclt fbfill <RRGGBB>\n");
 	printf("	mtlclt fbloaddump <file>\n");
+	printf("	mtlclt fbloadpng <file>\n");
 	printf("	mtlclt gesture\n");
 	printf("	mtlclt gestures\n");
 	printf("	mtlclt vstripes <width>\n");
@@ -169,19 +173,20 @@
 main(int argc, char *argv[] __unused)
 {
 	int b, fd, i, j;
-	u_int32_t *image;
+	u_int32_t *image, pixel;
 
 	if (argc < 2)
 		usage();
 
 	fb_init();
 
+	image = malloc(fb_width * fb_height * 4);
+	if (image == NULL)
+		err(1, "malloc");
+
 	if (strcmp(argv[1], "fbdump") == 0) {
 		if (argc != 3)
 			usage();
-		image = malloc(fb_width * fb_height * 4);
-		if (image == NULL)
-			err(1, "malloc");
 		if ((fd = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC)) == -1)
 			err(1, "open");
 		fb_save(image);
@@ -190,12 +195,74 @@
 			if (b == -1)
 				err(1, "write");
 		}
+	} else if (strcmp(argv[1], "fbdumppng") == 0) {
+		FILE * fp;
+		png_structp png_ptr;
+		png_infop info_ptr;
+		png_byte **row_pointers;
+		int pixel_size = 3;
+		int depth = 8;
+
+		if (argc != 3)
+			usage();
+		if ((fd = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC)) == -1)
+			err(1, "open");
+		if ((fp = fdopen(fd, "w")) == NULL)
+			err(1, "fdopen");
+
+		png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
+		    NULL, NULL, NULL);
+		if (png_ptr == NULL)
+			errx(1, "png_create_write_struct");
+		info_ptr = png_create_info_struct(png_ptr);
+		if (info_ptr == NULL)
+			errx(1, "png_create_info_struct");
+		if (setjmp(png_jmpbuf(png_ptr)) != 0)
+			errx(1, "png error");
+		png_set_IHDR (png_ptr, info_ptr, fb_width, fb_height, depth,
+		    PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
+		    PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
+		row_pointers = png_malloc(png_ptr,
+		    fb_height * sizeof(png_byte *));
+
+		fb_save(image);
+		for (j = 0; j < fb_height; j++) {
+			row_pointers[j] = png_malloc(png_ptr,
+			    sizeof(uint8_t) * fb_width * pixel_size);
+			for (i = 0; i < fb_width; i++) {
+				pixel = image[i + j * fb_width];
+				row_pointers[j][i * 3] = (pixel >> 8) & 0xFF;
+				row_pointers[j][i * 3 + 1] = (pixel >> 16) &
+				    0xFF;
+				row_pointers[j][i * 3 + 2] = (pixel >> 24) &
+				    0xFF;
+			}
+		}
+
+		png_init_io (png_ptr, fp);
+		png_set_rows (png_ptr, info_ptr, row_pointers);
+		png_write_png (png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
+		for (j = 0; j < fb_height; j++)
+			png_free (png_ptr, row_pointers[j]);
+		png_free (png_ptr, row_pointers);
+		fclose(fp);
+	} else if (strcmp(argv[1], "fbfill") == 0) {
+		char *endptr;
+		long color;
+
+		if (argc != 3)
+			usage();
+		color = strtol(argv[2], &endptr, 16);
+		if (*endptr != '\0' || color < 0 || color > 0xFFFFFF) {
+			warnx("invalid color %s", argv[2]);
+			usage();
+		}
+		pixel = fb_colour((color >> 16) & 0xFF, (color >> 16) & 0xFF,
+		    color & 0xFF);
+		fb_fill(pixel);
 	} else if (strcmp(argv[1], "fbloaddump") == 0) {
 		if (argc != 3)
 			usage();
-		image = malloc(fb_width * fb_height * 4);
-		if (image == NULL)
-			err(1, "malloc image buf");
 		if ((fd = open(argv[2], O_RDONLY)) == -1)
 			err(1, "open");
 		for (i = 0; i < fb_width * fb_height * 4; i += b) {
@@ -204,6 +271,16 @@
 				err(1, "read");
 		}
 		fb_post(image);
+		close(fd);
+	} else if (strcmp(argv[1], "fbloadpng") == 0) {
+		if (argc != 3)
+			usage();
+		if ((fd = open(argv[2], O_RDONLY)) == -1)
+			err(1, "open");
+		if (read_png_fd(fd, image, fb_width, fb_height) == -1)
+			err(1, "read_png_fd");
+		fb_post(image);
+		close(fd);
 	} else if (strcmp(argv[1], "gesture") == 0) {
 		print_gesture();
 	} else if (strcmp(argv[1], "gestures") == 0) {
@@ -220,9 +297,6 @@
 			usage();
 		}
 
-		image = malloc(fb_width * fb_height * 4);
-		if (image == NULL)
-			err(1, "malloc image buf");
 		for (i = 0; i < fb_width; i++)
 			for (j = 0; j < fb_height; j++)
 				image[i + j * fb_width] =
@@ -233,5 +307,7 @@
 	} else
 		usage();
 
+	free(image);
+
 	return (0);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201207251925.q6PJPO2f068041>