#include "bitmap.h" #include #include #include #include #include #include #include SaveBitmapCmd::SaveBitmapCmd ( const char* label, ButtonState* b, View* v ) : (label, b, 1) { input = new Sensor(updownEvents); view = v; bs = b; savedialog = new Finder(v, "Enter a file name for the drawing:"); } void SaveBitmapCmd::Press() { XImage *xi; printf("SaveBitmapcmd: Saving Bitmap!\n"); /* get the file name for saving the drawing */ const char* name = nil; name = savedialog->Find(); if (name == nil) return; /* sleep(1); */ int w, h; w = view->canvas->Width(); h = view->canvas->Height(); w = w / 8 * 8; h = h / 8 * 8; printf("canvas width=%d, height=%d\n", w, h); Window* window = view->canvas->window(); xi = XGetImage(window->display(), window, 0, 0, w, h, AllPlanes, XYPixmap); /* Raster* raster = new Raster(view->canvas, 0, 0, w, h); */ /* output the bitmap data */ FILE* f= fopen(name, "w"); if (f != NULL) { /* open successful */ fprintf(f, "#define bitmap_width %d\n", w); fprintf(f, "#define bitmap_height %d\n", h); fprintf(f, "static char bitmap_bits[] = { \n"); fprintf(f, " "); unsigned char bits = 0; float red, green, blue; /* white->Intensities(red, green, blue); int full = red; instead of testint it, assume full intensity 1.0 */ ColorIntensity full = 1.0; Color* color; register int x, y; int c8 = 0; int i = 0; for (y = h-1; y >= 0; y--) { for (x = 0; x < w ; x++) { color = XGetPixel(xi, x, y); if (color != NULL) { color->Intensities(red, green, blue); if (red != full || green != full || blue != full) { bits = bits | 128; } } if (c8 == 7) { c8 = 0; fprintf(f, "0x%02x\t", bits); i++; if (i == 12) { fprintf(f, "\n\t"); i = 0; } bits = 0; } else { c8++; bits = bits >> 1; } } } fprintf(f, "};\n"); successful = true; fclose(f); printf("Bitmap is saved in file %s\n", name); } delete xi; } boolean SaveBitmapCmd::SaveBitmap(XImage* xi, const char* name, int w, int h) { boolean successful = false; } LoadBitmapCmd::LoadBitmapCmd ( const char* label, ButtonState* b, View* v ) : (label, b, 1) { input = new Sensor(updownEvents); view = v; bs = b; loaddialog = new Finder(view, "Enter name of drawing to load:"); } void LoadBitmapCmd::Press() { printf("LoadBitmapcmd: Loading Bitmap!\n"); /* get the file name contains the drawing */ const char* name = nil; name = loaddialog->Find(); if (name == nil) return; Bitmap* bitmap = new Bitmap(name); output->Stencil(view->canvas, 0, 0, bitmap); /* send the bitmap to the remote user */ Record rec; unsigned char bits = 0; boolean b; register int x, y; int c8 = 0; int i = 0; unsigned char* p; int w, h; w = view->canvas->Width() / 8 * 8; h = view->canvas->Height() / 8 * 8; for (y = h-1; y >= 0; y--) { if (y == h-1) { p = rec.bbr.x_bits; } else { p = rec.nbr.x_bits; } for (x = 0; x < w ; x++) { b = bitmap->Peek(x, y); if (b != false) { bits = bits | 128; } if (c8 == 7) { c8 = 0; *p++ = bits; i++; bits = 0; } else { c8++; bits = bits >> 1; } } if (y == h-1) { rec.bbr.msgType = BOB; rec.bbr.W = w; rec.bbr.H = h; rec.bbr.Length = w/8; if (sendto(view->socketToUA, (char *) &(rec.bbr.msgType), 8+rec.bbr.Length, 0, &(view->toSocket), sizeof(struct sockaddr_un)) < 0) perror("sending datagram message"); } else { rec.nbr.msgType = NOB; rec.nbr.LineNo = y; rec.nbr.Length = w/8; if (sendto(view->socketToUA, (char *) &(rec.nbr.msgType), 6+rec.nbr.Length, 0, &(view->toSocket), sizeof(struct sockaddr_un)) < 0) perror("sending datagram message"); } } delete bitmap; }