Skip to content

Commit

Permalink
Move resize_bitmap() and rotate_bitmap() into bitblt.[ch]. Add horrib…
Browse files Browse the repository at this point in the history
…ly inefficient implementation of transpose().
  • Loading branch information
brouhaha committed Jun 10, 2017
1 parent e4b1297 commit 06bdecf
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 50 deletions.
64 changes: 60 additions & 4 deletions bitblt.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
#include "bitblt_tables.h"


#define SWAP(type,a,b) do { type temp; temp = a; a = b; b = temp; } while (0)

#define DIV_ROUND_UP(count,pow2) (((count) - 1) / (pow2) + 1)


Expand Down Expand Up @@ -716,14 +718,32 @@ void rot_180 (Bitmap *src) /* combination of flip_h and flip_v */
}

/* "in-place" transformations - will allocate new memory and free old */
// XXX hideously inefficient!
void transpose (Bitmap *src)
{
uint32_t new_row_words = DIV_ROUND_UP (rect_height (& src->rect), 32);
word_t *new_bits;
Rect transposed_rect;
Bitmap *dest;
Point src_coord, dest_coord;

new_bits = calloc (1, new_row_words * rect_width (& src->rect) * sizeof (word_t));
transposed_rect.min.x = src->rect.min.y;
transposed_rect.max.x = src->rect.max.y;
transposed_rect.min.y = src->rect.min.x;
transposed_rect.max.y = src->rect.max.x;
dest = create_bitmap (& transposed_rect);

/* $$$ more code needed here */
for (src_coord.y = src->rect.min.y; src_coord.y < src->rect.max.y; src_coord.y++)
{
dest_coord.x = src_coord.y;

for (src_coord.x = src->rect.min.x; src_coord.x < src->rect.max.x; src_coord.x++)
{
dest_coord.y = src_coord.x;
set_pixel(dest, dest_coord, get_pixel(src, src_coord));
}
}

SWAP(Bitmap, *src, *dest);
free_bitmap(dest);
}

void rot_90 (Bitmap *src) /* transpose + flip_h */
Expand All @@ -739,3 +759,39 @@ void rot_270 (Bitmap *src) /* transpose + flip_v */
}


/* frees original! */
Bitmap *resize_bitmap (Bitmap *src,
int width_pixels,
int height_pixels)
{
Rect src_rect;
Point dest_min;
Bitmap *dest;

src_rect.min.x = (rect_width (& src->rect) - width_pixels) / 2;
src_rect.min.y = (rect_height (& src->rect) - height_pixels) / 2;
src_rect.max.x = src_rect.min.x + width_pixels;
src_rect.max.y = src_rect.min.y + height_pixels;

dest_min.x = 0;
dest_min.y = 0;

dest = bitblt (src, & src_rect, NULL, & dest_min, TF_SRC, 0);
free_bitmap (src);
return (dest);
}


/* "in place" rotation */
void rotate_bitmap (Bitmap *src, int rotation)
{
switch (rotation)
{
case 0: break;
case 90: rot_90 (src); break;
case 180: rot_180 (src); break;
case 270: rot_270 (src); break;
default:
fprintf (stderr, "rotation %d, but must be 0, 90, 180, or 270\n", rotation);
}
}
9 changes: 9 additions & 0 deletions bitblt.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,12 @@ void reverse_bits (uint8_t *p, int byte_count);


void bitblt_write_g4 (Bitmap *bitmap, FILE *f);


/* frees original! */
Bitmap *resize_bitmap (Bitmap *src,
int width_pixels,
int height_pixels);

/* "in place" rotation */
void rotate_bitmap (Bitmap *src, int rotation);
49 changes: 3 additions & 46 deletions tumble_tiff.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,47 +239,6 @@ static bool get_tiff_image_info (int image,
}


/* frees original! */
static Bitmap *resize_bitmap (Bitmap *src,
double x_resolution,
double y_resolution,
input_attributes_t input_attributes)
{
Rect src_rect;
Point dest_min;
Bitmap *dest;

int width_pixels = input_attributes.page_size.width * x_resolution;
int height_pixels = input_attributes.page_size.height * y_resolution;

src_rect.min.x = (rect_width (& src->rect) - width_pixels) / 2;
src_rect.min.y = (rect_height (& src->rect) - height_pixels) / 2;
src_rect.max.x = src_rect.min.x + width_pixels;
src_rect.max.y = src_rect.min.y + height_pixels;

dest_min.x = 0;
dest_min.y = 0;

dest = bitblt (src, & src_rect, NULL, & dest_min, TF_SRC, 0);
free_bitmap (src);
return (dest);
}


/* "in place" rotation */
static void rotate_bitmap (Bitmap *src,
input_attributes_t input_attributes)
{
switch (input_attributes.rotation)
{
case 0: break;
case 90: rot_90 (src); break;
case 180: rot_180 (src); break;
case 270: rot_270 (src); break;
default:
fprintf (stderr, "rotation must be 0, 90, 180, or 270\n");
}
}


static bool process_tiff_image (int image, /* range 1 .. n */
Expand Down Expand Up @@ -335,13 +294,11 @@ static bool process_tiff_image (int image, /* range 1 .. n */
#if 0
if (input_attributes.has_page_size)
bitmap = resize_bitmap (bitmap,
x_resolution,
y_resolution,
input_attributes);
input_attributes.page_size.width * x_resolution,
input_attributes.page_size.height * y_resolution);
#endif

rotate_bitmap (bitmap,
input_attributes);
rotate_bitmap (bitmap, input_attributes.rotation);

#if 0
pdf_write_text (page);
Expand Down

0 comments on commit 06bdecf

Please sign in to comment.