add some sanity checks, fix montage script origin/HEAD origin/master
authorSyed S. Albiz <ssalbiz@uwaterloo.ca>
Thu, 28 Jun 2012 03:57:13 +0000 (23:57 -0400)
committerSyed S. Albiz <ssalbiz@uwaterloo.ca>
Thu, 28 Jun 2012 03:57:13 +0000 (23:57 -0400)
last
montage
shit.c

diff --git a/last b/last
index 8d9d090..c6b3b24 100755 (executable)
--- a/last
+++ b/last
@@ -9,6 +9,6 @@ do
   if [ -f  "${picpath}/${user}.png" ]; then
     ./blit_fb "${picpath}/${user}.png"
   else
-    ./blit_fb "${picpath}/black.png"
+    ./blit_fb "${picpath}/placeholder.png"
   fi
 done
diff --git a/montage b/montage
index 7c51d08..d1e669f 100755 (executable)
--- a/montage
+++ b/montage
@@ -12,7 +12,7 @@ read -e userlist
 #do
   for user in $userlist
   do
-    echo $user
+#    echo $user
     f="${picpath}/${user}.png"
     if [ -f  "${picpath}/${user}.png" ]; then
       f="${picpath}/${user}.png"
@@ -24,8 +24,9 @@ read -e userlist
   echo $filelist
 
   if [ ${#filelist} -gt 0 ]; then
-    echo montage -border 0 -geometry "1024x720+5+5" -background black $filelist "bg.png"
-    montage -border 0 -geometry "1024x720+5+5" -background black -label '%t' $filelist "${picpath}/bg.png"
+#    echo montage -border 0 -geometry "1024x720+5+5" -background black $filelist "bg.png"
+    montage -border 0 -geometry "1024x720" -background black -label '%t' -depth 8 $filelist "${picpath}/tmp.png"
+    convert -resize "1024x720" "${picpath}/tmp.png" "${picpath}/bg.png"
     ./blit_fb "${picpath}/bg.png"
   else
 #    echo feh --bg-scale "${picpath}/black.png"
diff --git a/shit.c b/shit.c
index fdf0330..c627747 100644 (file)
--- a/shit.c
+++ b/shit.c
 #define MIN(x, y) ((x) < (y) ? (x) : (y))
 #define MAX(x, y) ((x) > (y) ? (x) : (y))
 
+static inline void log_color_type(png_structp png_ptr, png_infop info_ptr) {
+    switch(png_get_color_type(png_ptr, info_ptr)) {
+      case PNG_COLOR_TYPE_GRAY:
+        puts("gray shit");
+        break;
+      case PNG_COLOR_TYPE_GRAY_ALPHA:
+        puts("transparent gray shit");
+        break;
+      case PNG_COLOR_TYPE_PALETTE:
+        puts("some shit");
+        break;
+      case PNG_COLOR_TYPE_RGB:
+        puts("rgb shit");
+        break;
+      case PNG_COLOR_TYPE_RGB_ALPHA:
+        puts("rgba shit");
+        break;
+    }
+}
+
 int main(int argc, char** argv)
 {
     int fbfd = 0;
@@ -43,7 +63,6 @@ int main(int argc, char** argv)
     }
     png_init_io(png_ptr, fp);
     png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
-    png_bytepp row_pointers = png_get_rows(png_ptr, info_ptr);
 
     // Open the file for reading and writing
     fbfd = open("/dev/fb0", O_RDWR);
@@ -77,32 +96,38 @@ int main(int argc, char** argv)
         exit(4);
     }
     printf("The framebuffer device was mapped to memory successfully.\n");
-    uint8_t channels = png_get_channels(png_ptr, info_ptr);
-
-    printf("png # of channels: %d\n", channels);
-    printf("png interlace: %s\n", info_ptr->interlace_type ? "YES" :  "NO");
-    printf("screen x-yoffset: %d %d\n", vinfo.xoffset, vinfo.yoffset);
-
+    uint8_t png_channels = png_get_channels(png_ptr, info_ptr);
+    uint32_t png_bit_depth = png_get_bit_depth(png_ptr, info_ptr);
+    log_color_type(png_ptr, info_ptr);
     // dump this shit to a framebuffer nigga
     assert(vinfo.bits_per_pixel == 32);
-    if (info_ptr->interlace_type) {
-      perror("INTERLACING!? FUCK OFF AND DIE");
+    if (info_ptr->interlace_type || png_bit_depth != 8) {
+      perror("NON RBG888? INTERLACING!? FUCK OFF AND DIE");
       munmap(fbp, screensize);
       close(fbfd);
       fclose(fp);
+      return 1;
     }
 
+    printf("png %ux%u\n", png_get_image_width(png_ptr, info_ptr),
+        png_get_image_height(png_ptr, info_ptr));
+    printf("png # of png_channels: %d\n", png_channels);
+    printf("png interlace: %s\n", png_get_interlace_type(png_ptr, info_ptr) ? "YES" :  "NO");
+    printf("png bit depth: %u\n", png_get_bit_depth(png_ptr, info_ptr));
+    printf("screen x-yoffset: %d %d\n", vinfo.xoffset, vinfo.yoffset);
+
+    png_bytepp row_pointers = png_get_rows(png_ptr, info_ptr);
     for (int y = 0; y < MIN(info_ptr->height, vinfo.yres-2); ++y) {
-      for (int x = 0; x < MIN(info_ptr->width, channels*vinfo.xres); ++x) {
-        assert(x*y*channels < channels*screensize);
+      for (int x = 0; x < MIN(info_ptr->width, png_channels*vinfo.xres-2); ++x) {
+        assert(x*y*png_channels < png_channels*screensize);
         location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) +
                     (y+vinfo.yoffset) * finfo.line_length;
 
-        if (channels == 3 || channels == 4) {
-          *(fbp + location) = row_pointers[y][channels*x+2]; // BLUE
-          *(fbp + location + 1) = row_pointers[y][(channels*x)+1]; // GREEN
-          *(fbp + location + 2) = row_pointers[y][(channels*x)+0]; // RED
-        } else if (channels == 1) {
+        if (png_channels == 3 || png_channels == 4) {
+          *(fbp + location) = row_pointers[y][png_channels*x+2]; // BLUE
+          *(fbp + location + 1) = row_pointers[y][(png_channels*x)+1]; // GREEN
+          *(fbp + location + 2) = row_pointers[y][(png_channels*x)]; // RED
+        } else if (png_channels == 1) {
           *(fbp + location) = row_pointers[y][x]; // BLUE
           *(fbp + location + 1) = row_pointers[y][x]; // GREEN
           *(fbp + location + 2) = row_pointers[y][x]; // RED