-#include "images/dup-cmp.h"
-
-static uns image_dup_scale_min_size = 16;
-static uns image_dup_ratio_threshold = 140;
-static uns image_dup_error_threshold = 50;
-
-static inline byte *
-image_dup_block(struct image_dup *dup, uns col, uns row)
-{
- ASSERT(col <= dup->cols && row <= dup->rows);
- return dup->buf + (dup->line << row) + (3 << (row + col));
-}
-
-static inline void
-pixels_average(byte *dest, byte *src1, byte *src2)
-{
- dest[0] = ((uns)src1[0] + (uns)src2[0]) >> 1;
- dest[1] = ((uns)src1[1] + (uns)src2[1]) >> 1;
- dest[2] = ((uns)src1[2] + (uns)src2[2]) >> 1;
-}
-
-void
-image_dup_init(struct image_dup *dup, struct image *image, struct mempool *pool)
-{
- ASSERT(image->width && image->height);
-
- dup->image = image;
- dup->width = image->width;
- dup->height = image->height;
- for (dup->cols = 0; (uns)(2 << dup->cols) < image->width; dup->cols++);
- for (dup->rows = 0; (uns)(2 << dup->rows) < image->height; dup->rows++);
- dup->buf = mp_alloc(pool, dup->buf_size = (12 << (dup->cols + dup->rows)));
- dup->line = 6 << dup->cols;
- dup->flags = 0;
- if (image->width >= image_dup_scale_min_size && image->height >= image_dup_scale_min_size)
- dup->flags |= IMAGE_DUP_FLAG_SCALE;
-
- /* Scale original image to right bottom block */
- {
- byte *d = image_dup_block(dup, dup->cols, dup->rows);
- uns width = 1 << dup->cols;
- uns height = 1 << dup->rows;
- uns line_size = 3 * image->width;
- uns src_y = 0;
- for (uns y = 0; y < height; y++)
- {
- byte *line = image->pixels + line_size * (src_y >> dup->rows);
- uns src_x = 0;
- for (uns x = 0; x < width; x++)
- {
- byte *s = line + 3 * (src_x >> dup->cols);
- d[0] = s[0];
- d[1] = s[1];
- d[2] = s[2];
- d += 3;
- src_x += image->width;
- }
- src_y += image->height;
- }
- }