35 #define DEFAULT_ALIGNMENT_U8X3 192 46 if ((stride % alignment) != 0)
47 stride += alignment - (stride % alignment);
49 uint8_t *buf = calloc(height*stride,
sizeof(uint8_t));
52 image_u8x3_t tmp = { .
width = width, .height = height, .stride = stride, .buf = buf };
61 uint8_t *buf = malloc(in->
height*in->
stride*
sizeof(uint8_t));
97 for (
int y = 0; y < im->
height; y++) {
98 for (
int x = 0; x < im->
width; x++) {
99 uint8_t gray = pnm->
buf[y*im->
width + x];
112 for (
int y = 0; y < im->
height; y++) {
113 for (
int x = 0; x < im->
width; x++) {
114 uint8_t r = pnm->
buf[y*im->
width*3 + 3*x];
115 uint8_t g = pnm->
buf[y*im->
width*3 + 3*x+1];
116 uint8_t b = pnm->
buf[y*im->
width*3 + 3*x+2];
134 FILE *f = fopen(path,
"wb");
143 fprintf(f,
"P6\n%d %d\n255\n", im->
width, im->
height);
144 int linesz = im->
width * 3;
145 for (
int y = 0; y < im->
height; y++) {
146 if (linesz != fwrite(&im->
buf[y*im->
stride], 1, linesz, f)) {
162 double dist = sqrtf((y1-y0)*(y1-y0) + (x1-x0)*(x1-x0));
163 double delta = 0.5 / dist;
166 for (
float f = 0; f <= 1; f += delta) {
167 int x = ((int) (x1 + (x0 - x1) * f));
168 int y = ((int) (y1 + (y0 - y1) * f));
170 if (x < 0 || y < 0 || x >= im->
width || y >= im->
height)
173 int idx = y*im->
stride + 3*x;
174 for (
int i = 0; i < 3; i++)
175 im->
buf[idx + i] = rgb[i];
179 static void convolve(
const uint8_t *x, uint8_t *y,
int sz,
const uint8_t *k,
int ksz)
183 for (
int i = 0; i < ksz/2 && i < sz; i++)
186 for (
int i = 0; i < sz - ksz; i++) {
189 for (
int j = 0; j < ksz; j++)
192 y[ksz/2 + i] = acc >> 8;
195 for (
int i = sz - ksz + ksz/2; i < sz; i++)
204 assert((ksz & 1) == 1);
211 for (
int i = 0; i < ksz; i++) {
213 double v = exp(-.5*
sq(x / sigma));
219 for (
int i = 0; i < ksz; i++)
222 for (
int i = 0; i < ksz; i++)
226 for (
int i = 0; i < ksz; i++)
230 for (
int i = 0; i < ksz; i++)
231 printf(
"%d %15f %5d\n", i, dk[i], k[i]);
234 for (
int c = 0; c < 3; c++) {
235 for (
int y = 0; y < im->
height; y++) {
240 for (
int x = 0; x < im->
width; x++)
241 in[x] = im->
buf[y*im->
stride + 3 * x + c];
245 for (
int x = 0; x < im->
width; x++)
246 im->
buf[y*im->
stride + 3 * x + c] = out[x];
249 for (
int x = 0; x < im->
width; x++) {
253 for (
int y = 0; y < im->
height; y++)
258 for (
int y = 0; y < im->
height; y++)
259 im->
buf[y*im->
stride + 3*x + c] = out[y];
static void convolve(const uint8_t *x, uint8_t *y, int sz, const uint8_t *k, int ksz)
int image_u8x3_write_pnm(const image_u8x3_t *im, const char *path)
image_u8x3_t * image_u8x3_create_alignment(unsigned int width, unsigned int height, unsigned int alignment)
image_u8x3_t * image_u8x3_create(unsigned int width, unsigned int height)
static double sq(double v)
void image_u8x3_gaussian_blur(image_u8x3_t *im, double sigma, int ksz)
void image_u8x3_draw_line(image_u8x3_t *im, float x0, float y0, float x1, float y1, uint8_t rgb[3], int width)
#define DEFAULT_ALIGNMENT_U8X3
pnm_t * pnm_create_from_file(const char *path)
void pnm_destroy(pnm_t *pnm)
static TTYPENAME *TFN() copy(TTYPENAME *hash)
image_u8x3_t * image_u8x3_copy(const image_u8x3_t *in)
image_u8x3_t * image_u8x3_create_from_pnm(const char *path)
void image_u8x3_destroy(image_u8x3_t *im)