rotation interpolation. git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/libpipi/trunk@2811 92316355-f0b4-4df1-b90c-862c8a59935fremotes/tiles
@@ -104,11 +104,16 @@ int pipi_command(pipi_context_t *ctx, char const *cmd, ...) | |||||
pipi_free(ctx->images[ctx->nimages - 2]); | pipi_free(ctx->images[ctx->nimages - 2]); | ||||
ctx->nimages--; | ctx->nimages--; | ||||
} | } | ||||
else if(!strcmp(method, "ordered")) | |||||
else if(!strncmp(method, "ordered", 7)) | |||||
{ | { | ||||
double angle = .0; | |||||
method = strchr(method, ':'); | |||||
if(method) | |||||
angle = atof(method + 1); | |||||
if(ctx->nimages < 2) | if(ctx->nimages < 2) | ||||
return -1; | return -1; | ||||
dst = pipi_dither_ordered(ctx->images[ctx->nimages - 2], src); | |||||
dst = pipi_dither_ordered_ext(ctx->images[ctx->nimages - 2], src, | |||||
angle); | |||||
pipi_free(ctx->images[ctx->nimages - 2]); | pipi_free(ctx->images[ctx->nimages - 2]); | ||||
ctx->nimages--; | ctx->nimages--; | ||||
} | } | ||||
@@ -20,22 +20,33 @@ | |||||
#include "common.h" | #include "common.h" | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <math.h> | |||||
#include "pipi.h" | #include "pipi.h" | ||||
#include "pipi_internals.h" | #include "pipi_internals.h" | ||||
pipi_image_t *pipi_dither_ordered(pipi_image_t *img, pipi_image_t *kernel) | pipi_image_t *pipi_dither_ordered(pipi_image_t *img, pipi_image_t *kernel) | ||||
{ | { | ||||
return pipi_dither_ordered_ext(img, kernel, 0.0); | |||||
} | |||||
pipi_image_t *pipi_dither_ordered_ext(pipi_image_t *img, pipi_image_t *kernel, | |||||
double angle) | |||||
{ | |||||
double sint, cost; | |||||
pipi_image_t *dst; | pipi_image_t *dst; | ||||
pipi_pixels_t *dstp, *kernelp; | pipi_pixels_t *dstp, *kernelp; | ||||
float *dstdata, *kerneldata; | float *dstdata, *kerneldata; | ||||
int x, y, w, h, kw, kh; | |||||
int x, y, w, h, kx, ky, kw, kh; | |||||
w = img->w; | w = img->w; | ||||
h = img->h; | h = img->h; | ||||
kw = kernel->w; | kw = kernel->w; | ||||
kh = kernel->h; | kh = kernel->h; | ||||
cost = cos(angle * (M_PI / 180)); | |||||
sint = sin(angle * (M_PI / 180)); | |||||
dst = pipi_copy(img); | dst = pipi_copy(img); | ||||
dstp = pipi_getpixels(dst, PIPI_PIXELS_Y_F); | dstp = pipi_getpixels(dst, PIPI_PIXELS_Y_F); | ||||
dstdata = (float *)dstp->pixels; | dstdata = (float *)dstp->pixels; | ||||
@@ -49,8 +60,11 @@ pipi_image_t *pipi_dither_ordered(pipi_image_t *img, pipi_image_t *kernel) | |||||
{ | { | ||||
float p, q; | float p, q; | ||||
kx = (int)(cost * x - sint * y + 2 * w * h) % kw; | |||||
ky = (int)(cost * y + sint * x + 2 * w * h) % kh; | |||||
p = dstdata[y * w + x]; | p = dstdata[y * w + x]; | ||||
q = p > kerneldata[(y % kh) * kw + (x % kw)] ? 1. : 0.; | |||||
q = p > kerneldata[ky * kw + kx] ? 1. : 0.; | |||||
dstdata[y * w + x] = q; | dstdata[y * w + x] = q; | ||||
} | } | ||||
} | } | ||||
@@ -182,6 +182,8 @@ extern pipi_image_t *pipi_reduce(pipi_image_t *, int, double const *); | |||||
extern pipi_image_t *pipi_dither_ediff(pipi_image_t *, pipi_image_t *, | extern pipi_image_t *pipi_dither_ediff(pipi_image_t *, pipi_image_t *, | ||||
pipi_scan_t); | pipi_scan_t); | ||||
extern pipi_image_t *pipi_dither_ordered(pipi_image_t *, pipi_image_t *); | extern pipi_image_t *pipi_dither_ordered(pipi_image_t *, pipi_image_t *); | ||||
extern pipi_image_t *pipi_dither_ordered_ext(pipi_image_t *, pipi_image_t *, | |||||
double); | |||||
extern pipi_image_t *pipi_dither_halftone(pipi_image_t *, double, double); | extern pipi_image_t *pipi_dither_halftone(pipi_image_t *, double, double); | ||||
extern pipi_image_t *pipi_dither_random(pipi_image_t *); | extern pipi_image_t *pipi_dither_random(pipi_image_t *); | ||||
extern pipi_image_t *pipi_dither_ostromoukhov(pipi_image_t *, pipi_scan_t); | extern pipi_image_t *pipi_dither_ostromoukhov(pipi_image_t *, pipi_scan_t); | ||||