diff --git a/bitblt.c b/bitblt.c index 0597d77..7862335 100644 --- a/bitblt.c +++ b/bitblt.c @@ -72,9 +72,7 @@ Bitmap *bitblt (Bitmap *src_bitmap, Rect src_rect, Bitmap *dest_bitmap, Point dest_upper_left, - boolean flip_horizontal, - boolean flip_vertical, - boolean transpose, + int scan, int tfn) { Point src_point, dest_point; @@ -82,7 +80,7 @@ Bitmap *bitblt (Bitmap *src_bitmap, if (! dest_bitmap) { - if (transpose) + if (scan & TRANSPOSE) dest_bitmap = create_bitmap (rect_height (src_rect), rect_width (src_rect)); else @@ -102,17 +100,32 @@ Bitmap *bitblt (Bitmap *src_bitmap, { boolean a, b, c; - if (transpose) + if (scan & TRANSPOSE) { - dest_point.x = dest_upper_left.x + (src_point.y - src_rect.upper_left.y); - dest_point.y = dest_upper_left.y + (src_point.x - src_rect.upper_left.x); + dest_point.x = src_point.y - src_rect.upper_left.y; + dest_point.y = src_point.x - src_rect.upper_left.x; + + if (scan & FLIP_H) + dest_point.x = (rect_height (src_rect) - 1) - dest_point.x; + + if (scan & FLIP_V) + dest_point.y = (rect_width (src_rect) - 1) - dest_point.y; } else { - dest_point.x = dest_upper_left.x + (src_point.x - src_rect.upper_left.x); - dest_point.y = dest_upper_left.y + (src_point.y - src_rect.upper_left.y); + dest_point.x = src_point.x - src_rect.upper_left.x; + dest_point.y = src_point.y - src_rect.upper_left.y; + + if (scan & FLIP_H) + dest_point.x = (rect_width (src_rect) - 1) - dest_point.x; + + if (scan & FLIP_V) + dest_point.y = (rect_height (src_rect) - 1) - dest_point.y; } + dest_point.x += dest_upper_left.x; + dest_point.y += dest_upper_left.y; + a = get_pixel (src_bitmap, src_point); b = get_pixel (dest_bitmap, dest_point); c = (tfn & (1 << (a * 2 + b))) != 0; diff --git a/bitblt.h b/bitblt.h index c19fece..dd87064 100644 --- a/bitblt.h +++ b/bitblt.h @@ -29,6 +29,16 @@ typedef struct Bitmap #define TF_XOR 0x6 +#define FLIP_H 0x1 +#define FLIP_V 0x2 +#define TRANSPOSE 0x4 + +#define ROT_0 0x0 +#define ROT_90 (TRANSPOSE + FLIP_H) +#define ROT_180 (FLIP_H + FLIP_V) +#define ROT_270 (TRANSPOSE + FLIP_V) + + Bitmap *create_bitmap (u32 width, u32 height); void free_bitmap (Bitmap *bitmap); boolean get_pixel (Bitmap *bitmap, Point coord); @@ -38,7 +48,5 @@ Bitmap *bitblt (Bitmap *src_bitmap, Rect src_rect, Bitmap *dest_bitmap, Point dest_upper_left, - boolean flip_horizontal, - boolean flip_vertical, - boolean transpose, + int scan, int tfn); diff --git a/bitblt_test.c b/bitblt_test.c index 3653d43..a2f4213 100644 --- a/bitblt_test.c +++ b/bitblt_test.c @@ -16,7 +16,7 @@ char test_data [HEIGHT][WIDTH] = ".....X....X...X.....", ".....X.....X..X.....", ".....XXXXXXXXXX.....", - ".....XXXXXXXXXX....." + ".....X.X.X.X.X......" }; Bitmap *setup (void) @@ -82,8 +82,7 @@ int main (int argc, char *argv[]) b2 = bitblt (b, r, NULL, p, - 0, 0, - 1, /* transpose */ + ROT_90, TF_SRC); if (! b2) {