void BWUp(Widget w) { BitmapWidget BW = (BitmapWidget) w; register Position x, y; bit first, up, down=0; Position from_x, from_y, to_x, to_y; if (BWQueryMarked(w)) { from_x = BW->bitmap.mark.from_x; from_y = BW->bitmap.mark.from_y; to_x = BW->bitmap.mark.to_x; to_y = BW->bitmap.mark.to_y; } else { from_x = 0; from_y = 0; to_x = BW->bitmap.width - 1; to_y = BW->bitmap.height - 1; } if ((to_y - from_y) == 0) return; for(x = from_x; x <= to_x; x++) { first = up = GetBit(BW->bitmap.image, x, to_y); for(y = to_y - 1; y >= from_y; y--) { down = GetBit(BW->bitmap.image, x, y); if (up != down) InvertPoint(BW, x, y); up =down; } if(first != down) InvertPoint(BW, x, to_y); } if (QuerySet(BW->bitmap.hot.x, BW->bitmap.hot.y) && !BWQueryMarked(w)) BWSetHotSpot(w, BW->bitmap.hot.x, (BW->bitmap.hot.y - 1 + BW->bitmap.image->height) % BW->bitmap.image->height); }
void BWLeft(Widget w) { BitmapWidget BW = (BitmapWidget) w; register Position x, y; bit first, left, right=0; Position from_x, from_y, to_x, to_y; if (BWQueryMarked(w)) { from_x = BW->bitmap.mark.from_x; from_y = BW->bitmap.mark.from_y; to_x = BW->bitmap.mark.to_x; to_y = BW->bitmap.mark.to_y; } else { from_x = 0; from_y = 0; to_x = BW->bitmap.width - 1; to_y = BW->bitmap.height - 1; } if ((to_x - from_x) == 0) return; for(y = from_y; y <= to_y; y++) { first = left = GetBit(BW->bitmap.image, to_x, y); for(x = to_x - 1; x >= from_x; x--) { right = GetBit(BW->bitmap.image, x, y); if (left != right) InvertPoint(BW, x, y); left = right; } if(first != right) InvertPoint(BW, to_x, y); } if (QuerySet(BW->bitmap.hot.x, BW->bitmap.hot.y) && !BWQueryMarked(w)) BWSetHotSpot(w, (BW->bitmap.hot.x - 1 + BW->bitmap.image->width) % BW->bitmap.image->width, BW->bitmap.hot.y); }
/* ARGSUSED */ static Boolean ConvertSelection(Widget w, Atom *selection, Atom *target, Atom *type, XtPointer *val_ret, unsigned long *length, int *format) { XPointer *value = (XPointer *)val_ret; BitmapWidget BW = (BitmapWidget) w; Pixmap *pixmap; char *data; XImage *image; Dimension width, height; switch (*target) { /* XA_TARGETS undefined ?!? case XA_TARGETS: *type = XA_ATOM; *value = (XPointer) bitmapClassRec.bitmap_class.targets; *length = bitmapClassRec.bitmap_class.num_targets; *format = 32; return True; */ case XA_BITMAP: case XA_PIXMAP: if (BWQueryMarked(w)) { width = BW->bitmap.mark.to_x - BW->bitmap.mark.from_x + 1; height = BW->bitmap.mark.to_y - BW->bitmap.mark.from_y + 1; data = CreateCleanData(Length(width, height)); image = CreateBitmapImage(BW, data, width, height); CopyImageData(BW->bitmap.image, image, BW->bitmap.mark.from_x, BW->bitmap.mark.from_y, BW->bitmap.mark.to_x, BW->bitmap.mark.to_y, 0, 0); pixmap = (Pixmap *) XtMalloc(sizeof(Pixmap)); *pixmap = GetPixmap(BW, image); DestroyBitmapImage(&image); } else if (BWQueryStored(w)) { pixmap = (Pixmap *) XtMalloc(sizeof(Pixmap)); *pixmap = GetPixmap(BW, BW->bitmap.storage); } else return False; *type = XA_PIXMAP; *value = (XPointer) pixmap; *length = 1; *format = 32; return True; default: return False; } }
void BWFlipVert(Widget w) { BitmapWidget BW = (BitmapWidget) w; register Position x, y; Position from_x, from_y, to_x, to_y; float half; if (BWQueryMarked(w)) { from_x = BW->bitmap.mark.from_x; from_y = BW->bitmap.mark.from_y; to_x = BW->bitmap.mark.to_x; to_y = BW->bitmap.mark.to_y; } else { from_x = 0; from_y = 0; to_x = BW->bitmap.width - 1; to_y = BW->bitmap.height - 1; } half = (float) (to_x - from_x) / 2.0 + 0.5; if (half == 0) return; for (y = from_y; y <= to_y; y++) for (x = 0; x < half; x++) if (GetBit(BW->bitmap.image, from_x + x, y) != GetBit(BW->bitmap.image, to_x - x, y)) { InvertPoint(BW, from_x + x, y); InvertPoint(BW, to_x - x, y); } if (QuerySet(BW->bitmap.hot.x, BW->bitmap.hot.y) && !BWQueryMarked(w)) BWSetHotSpot(w, BW->bitmap.image->width - 1 - BW->bitmap.hot.x, BW->bitmap.hot.y); }
void BWRotateRight(Widget w) { BitmapWidget BW = (BitmapWidget) w; Position x, y, delta, shift, tmp; Position half_width, half_height; XPoint hot; bit quad1, quad2, quad3, quad4; Position from_x, from_y, to_x, to_y; if (BWQueryMarked(w)) { from_x = BW->bitmap.mark.from_x; from_y = BW->bitmap.mark.from_y; to_x = BW->bitmap.mark.to_x; to_y = BW->bitmap.mark.to_y; } else { from_x = 0; from_y = 0; to_x = BW->bitmap.width - 1; to_y = BW->bitmap.height - 1; } half_width = floor((to_x - from_x) / 2.0 + 0.5); half_height = floor((to_y - from_y ) / 2.0 + 0.5); shift = min((Position)(to_x - from_x), (Position)(to_y - from_y )) % 2; delta = min((Position) half_width, (Position) half_height) - shift; for (x = 0; x <= delta; x++) { for (y = 1 - shift; y <= delta; y++) { quad1 = GetBit(BW->bitmap.image, from_x + (Position)half_width + x, from_y + (Position)half_height + y); quad2 = GetBit(BW->bitmap.image, from_x + (Position)half_width + y, from_y + (Position)half_height - shift - x); quad3 = GetBit(BW->bitmap.image, from_x + (Position)half_width - shift - x, from_y + (Position)half_height - shift - y); quad4 = GetBit(BW->bitmap.image, from_x + (Position)half_width - shift - y, from_y + (Position)half_height + x); if (quad1 != quad2) InvertPoint(BW, from_x + (Position)half_width + x, from_y + (Position)half_height + y); if (quad2 != quad3) InvertPoint(BW, from_x + (Position)half_width + y, from_y + (Position)half_height - shift - x); if (quad3 != quad4) InvertPoint(BW, from_x + (Position)half_width - shift - x, from_y + (Position)half_height - shift - y); if (quad4 != quad1) InvertPoint(BW, from_x + (Position)half_width - shift - y, from_y + (Position)half_height + x); } } if (QuerySet(BW->bitmap.hot.x, BW->bitmap.hot.y) && !BWQueryMarked(w)) { hot.x = BW->bitmap.hot.x - half_width; hot.y = BW->bitmap.hot.y - half_height; if (hot.x >= 0) hot.x += shift; if (hot.y >= 0) hot.y += shift; tmp = hot.x; hot.x = - hot.y; hot.y = tmp; if (hot.x > 0) hot.x -= shift; if (hot.y > 0) hot.y -= shift; hot.x += half_width; hot.y += half_height; if (QueryInBitmap(BW, hot.x, hot.y)) BWSetHotSpot(w, hot.x, hot.y); } }