#include #include #include #include enum { B = 0, G = 1, R = 2, A = 3, }; static Image *image = nil; enum{ Border = 2, Edge = 5 }; void eresized (int new) { Rectangle r; if (new && getwindow (display, Refnone) < 0) { sysfatal ("png: can't reattach to window"); } if(image == nil) return; r = insetrect (screen->clipr, Edge + Border); r.max.x = r.min.x + Dx (image->r); r.max.y = r.min.y + Dy (image->r); border (screen, r, -Border, nil, ZP); draw (screen, r, image, nil, image->r.min); flushimage (display, 1); } void main (int, char **) { Rectangle r; Image *m, *m2; int ch, size; char pixel[4]; unsigned long outchan = ARGB32; unsigned char *buf, *bp; r.min = Pt (0, 0); r.max = Pt (160, 160); size = Dx (r) * Dy(r) * sizeof (pixel); bp = buf = (unsigned char *) malloc (size); ch = -1; while (bp < buf + size) { // ch = (ch + 1) % 16; ch = 15; pixel[R] = (ch & 0x01) ? 0x00 : 0x00; pixel[G] = (ch & 0x02) ? 0xFF : 0x00; pixel[B] = (ch & 0x04) ? 0xFF : 0x00; pixel[A] = (ch & 0x08) ? 0xFF : 0x00; *((unsigned long *) bp) = *((unsigned long *) pixel); bp += sizeof (pixel); } fprint (2, "R: %#02x G: %#02x B: %#02x A: %#02x\n", pixel[R] & 0xFF, pixel[G] & 0xFF, pixel[B] & 0xFF, pixel[A] & 0xFF); while (bp < buf + size) { *((unsigned long *) bp) = *((unsigned long *) pixel); bp += sizeof (pixel); } if (1) { initdraw (0, 0, 0); einit (Ekeyboard | Emouse); if ((m = allocimage (display, r, outchan, 1, 0)) == 0) { sysfatal ("No image"); } if (loadimage (m, m->r, buf, size) < 0) { sysfatal ("Image load failed: %r"); } if ((m2 = allocimage (display, r, outchan, 1, 0)) == 0) { sysfatal ("No backup image"); } draw (m2, r, display->white, nil, ZP); draw (m2, m2->r, m, nil, m->r.min); image = m2; eresized(0); if ((ch = ekbd()) == 'q' || ch == 0x7F || ch == 0x04) return; draw (screen, screen->clipr, display->white, nil, ZP); image = nil; freeimage (m); } else { char chan[10]; int row, row_bytes = Dy(r) * sizeof (pixel); chantostr ((char *) chan, outchan); chan[9] = '\0'; print ("%11s %11d %11d %11d %11d ", chan, 0, 0, Dx (r), Dy (r)); bp = buf; for (row = 0; row < Dy (r); ++row) { if (write (1, bp, row_bytes) != row_bytes) { sysfatal ("Write error: %r"); } bp += row_bytes; } } return; }