40 #define DEFAULT_ALIGNMENT_U8 96
44 uint8_t *buf = calloc(height*stride,
sizeof(uint8_t));
47 image_u8_t tmp = { .
width = width, .height = height, .stride = stride, .buf = buf };
63 if ((stride % alignment) != 0)
64 stride += alignment - (stride % alignment);
71 uint8_t *buf = malloc(in->
height*in->
stride*
sizeof(uint8_t));
111 for (
int y = 0; y < im->
height; y++)
113 }
else if (
pnm->
max == 65535) {
114 for (
int y = 0; y < im->
height; y++)
115 for (
int x = 0; x < im->
width; x++)
129 for (
int y = 0; y < im->
height; y++) {
130 for (
int x = 0; x < im->
width; x++) {
140 }
else if (
pnm->
max == 65535) {
141 for (
int y = 0; y < im->
height; y++) {
142 for (
int x = 0; x < im->
width; x++) {
147 im->
buf[y*im->
stride + x] = (r + g + g + b) / 4;
163 int pbmstride = (im->
width + 7) / 8;
165 for (
int y = 0; y < im->
height; y++) {
166 for (
int x = 0; x < im->
width; x++) {
167 int byteidx = y * pbmstride + x / 8;
168 int bitidx = 7 - (x & 7);
171 if ((
pnm->
buf[byteidx] >> bitidx) & 1)
189 for (
int y = 0; y < fim->
height; y++) {
190 for (
int x = 0; x < fim->
width; x++) {
192 im->
buf[y*im->
stride + x] = (int) (255 * v);
202 FILE *f = fopen(path,
"wb");
211 fprintf(f,
"P5\n%d %d\n255\n", im->
width, im->
height);
213 for (
int y = 0; y < im->
height; y++) {
231 for (
int y = y0-r; y <= y0+r; y++) {
232 for (
int x = x0-r; x <= x0+r; x++) {
233 float d = (x-x0)*(x-x0) + (y-y0)*(y-y0);
237 if (x >= 0 && x < im->width && y >= 0 && y < im->height) {
238 int idx = y*im->
stride + x;
252 for (
int y = y0-r1; y <= y0+r1; y++) {
253 for (
int x = x0-r1; x <= x0+r1; x++) {
254 float d = (x-x0)*(x-x0) + (y-y0)*(y-y0);
255 if (d < r0 || d > r1)
258 int idx = y*im->
stride + x;
267 double dist = sqrtf((y1-y0)*(y1-y0) + (x1-x0)*(x1-x0));
271 double delta = 0.5 / dist;
274 for (
float f = 0; f <= 1; f += delta) {
275 int x = ((int) (x1 + (x0 - x1) * f));
276 int y = ((int) (y1 + (y0 - y1) * f));
278 if (x < 0 || y < 0 || x >= im->
width || y >= im->
height)
281 int idx = y*im->
stride + x;
293 for (
int y = 0; y < im->
height; y++) {
294 for (
int x = 0; x < im->
width; x++) {
300 static void convolve(
const uint8_t *x, uint8_t *y,
int sz,
const uint8_t *k,
int ksz)
304 for (
int i = 0; i < ksz/2 && i < sz; i++)
307 for (
int i = 0; i < sz - ksz; i++) {
310 for (
int j = 0; j < ksz; j++)
313 y[ksz/2 + i] = acc >> 8;
316 for (
int i = sz - ksz + ksz/2; i < sz; i++)
322 assert((ksz & 1) == 1);
324 for (
int y = 0; y < im->
height; y++) {
326 uint8_t *x = malloc(
sizeof(uint8_t)*im->
stride);
333 for (
int x = 0; x < im->
width; x++) {
334 uint8_t *xb = malloc(
sizeof(uint8_t)*im->
height);
335 uint8_t *yb = malloc(
sizeof(uint8_t)*im->
height);
337 for (
int y = 0; y < im->
height; y++)
343 for (
int y = 0; y < im->
height; y++)
354 assert((ksz & 1) == 1);
357 double *dk = malloc(
sizeof(
double)*ksz);
361 for (
int i = 0; i < ksz; i++) {
363 double v = exp(-.5*
sq(x / sigma));
369 for (
int i = 0; i < ksz; i++)
372 for (
int i = 0; i < ksz; i++)
375 uint8_t *k = malloc(
sizeof(uint8_t)*ksz);
376 for (
int i = 0; i < ksz; i++)
380 for (
int i = 0; i < ksz; i++)
381 printf(
"%d %15f %5d\n", i, dk[i], k[i]);
394 float c = cos(rad), s = sin(rad);
396 float p[][2] = { { 0, 0}, { iwidth, 0 }, { iwidth, iheight }, { 0, iheight} };
398 float xmin = HUGE_VALF, xmax = -HUGE_VALF, ymin = HUGE_VALF, ymax = -HUGE_VALF;
399 float icx = iwidth / 2.0, icy = iheight / 2.0;
401 for (
int i = 0; i < 4; i++) {
402 float px = p[i][0] - icx;
403 float py = p[i][1] - icy;
405 float nx = px*c - py*s;
406 float ny = px*s + py*c;
408 xmin = fmin(xmin, nx);
409 xmax = fmax(xmax, nx);
410 ymin = fmin(ymin, ny);
411 ymax = fmax(ymax, ny);
414 int owidth = ceil(xmax-xmin), oheight = ceil(ymax - ymin);
418 for (
int oy = 0; oy < oheight; oy++) {
419 for (
int ox = 0; ox < owidth; ox++) {
422 float sx = ox - owidth / 2.0 + .5;
423 float sy = oy - oheight / 2.0 + .5;
426 int ix = floor(sx*c + sy*s + icx);
427 int iy = floor(-sx*s + sy*c + icy);
429 if (ix >= 0 && iy >= 0 && ix < iwidth && iy < iheight)
443 if (ffactor == 1.5) {
444 int swidth = width / 3 * 2, sheight = height / 3 * 2;
449 while (sy < sheight) {
451 while (sx < swidth) {
456 uint8_t a = im->
buf[(y+0)*im->
stride + (x+0)];
457 uint8_t b = im->
buf[(y+0)*im->
stride + (x+1)];
458 uint8_t c = im->
buf[(y+0)*im->
stride + (x+2)];
460 uint8_t d = im->
buf[(y+1)*im->
stride + (x+0)];
461 uint8_t e = im->
buf[(y+1)*im->
stride + (x+1)];
462 uint8_t f = im->
buf[(y+1)*im->
stride + (x+2)];
464 uint8_t g = im->
buf[(y+2)*im->
stride + (x+0)];
465 uint8_t h = im->
buf[(y+2)*im->
stride + (x+1)];
466 uint8_t i = im->
buf[(y+2)*im->
stride + (x+2)];
468 decim->
buf[(sy+0)*decim->
stride + (sx + 0)] =
470 decim->
buf[(sy+0)*decim->
stride + (sx + 1)] =
473 decim->
buf[(sy+1)*decim->
stride + (sx + 0)] =
475 decim->
buf[(sy+1)*decim->
stride + (sx + 1)] =
489 int factor = (int) ffactor;
491 int swidth = 1 + (width - 1)/factor;
492 int sheight = 1 + (height - 1)/factor;
495 for (
int y = 0; y < height; y += factor) {
497 for (
int x = 0; x < width; x += factor) {
510 float max_dist = sqrt(max_dist2);
513 double theta = atan2(xy1[1]-xy0[1], xy1[0]-xy0[0]);
514 double v = sin(theta), u = cos(theta);
516 int ix0 =
iclamp(fmin(xy0[0], xy1[0]) - max_dist, 0, im->
width-1);
517 int ix1 =
iclamp(fmax(xy0[0], xy1[0]) + max_dist, 0, im->
width-1);
519 int iy0 =
iclamp(fmin(xy0[1], xy1[1]) - max_dist, 0, im->
height-1);
520 int iy1 =
iclamp(fmax(xy0[1], xy1[1]) + max_dist, 0, im->
height-1);
524 float xy1_line_coord = (xy1[0]-xy0[0])*u + (xy1[1]-xy0[1])*v;
526 float min_line_coord = fmin(0, xy1_line_coord);
527 float max_line_coord = fmax(0, xy1_line_coord);
529 for (
int iy = iy0; iy <= iy1; iy++) {
532 for (
int ix = ix0; ix <= ix1; ix++) {
536 float line_coord = (x - xy0[0])*u + (y - xy0[1])*v;
539 if (line_coord < min_line_coord)
540 line_coord = min_line_coord;
541 else if (line_coord > max_line_coord)
542 line_coord = max_line_coord;
544 float px = xy0[0] + line_coord*u;
545 float py = xy0[1] + line_coord*v;
547 double dist2 = (x-px)*(x-px) + (y-py)*(y-py);
550 int idx = dist2 * lut->
scale;
554 uint8_t lut_value = lut->
values[idx];
555 uint8_t old_value = im->
buf[iy*im->
stride + ix];
556 if (lut_value > old_value)