forked from tTh/FloatImg
making operators from garbage
This commit is contained in:
parent
6258bd08ed
commit
016497c870
@ -130,6 +130,24 @@ La première contient les choses qui sont relativement figées,
|
|||||||
et la seconde celles qui risquent de bouger. Cette classification
|
et la seconde celles qui risquent de bouger. Cette classification
|
||||||
est en fait arbitraire.
|
est en fait arbitraire.
|
||||||
|
|
||||||
|
\subsection{Structures, macros\dots}
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
/*
|
||||||
|
* in memory descriptor
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
int type;
|
||||||
|
float fval;
|
||||||
|
int count;
|
||||||
|
float *R, *G, *B, *A;
|
||||||
|
int reserved;
|
||||||
|
} FloatImg;
|
||||||
|
\end{verbatim}\index{FloatImg}
|
||||||
|
|
||||||
|
|
||||||
\subsection{lib/}\index{lib/}
|
\subsection{lib/}\index{lib/}
|
||||||
|
|
||||||
Première chose, la gestion dynamique de la mémoire occupées
|
Première chose, la gestion dynamique de la mémoire occupées
|
||||||
|
@ -46,6 +46,11 @@ int fimg_plot_rgb (FloatImg *head, int x, int y, float r, float g, float b);
|
|||||||
int fimg_clear(FloatImg *fimg);
|
int fimg_clear(FloatImg *fimg);
|
||||||
int fimg_add_rgb(FloatImg *head, int x, int y, float r, float g, float b);
|
int fimg_add_rgb(FloatImg *head, int x, int y, float r, float g, float b);
|
||||||
|
|
||||||
|
/* 'operats' module */
|
||||||
|
int fimg_add(FloatImg *a, FloatImg *b, FloatImg *d);
|
||||||
|
int fimg_sub(FloatImg *a, FloatImg *b, FloatImg *d);
|
||||||
|
int fimg_mul(FloatImg *a, FloatImg *b, FloatImg *d);
|
||||||
|
|
||||||
/* PNM files module */
|
/* PNM files module */
|
||||||
int fimg_save_as_pnm(FloatImg *head, char *fname, int notused);
|
int fimg_save_as_pnm(FloatImg *head, char *fname, int notused);
|
||||||
int fimg_load_from_pnm(char *fname, FloatImg *head, int notused);
|
int fimg_load_from_pnm(char *fname, FloatImg *head, int notused);
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
COPT = -Wall -fpic -g -pg -no-pie -DDEBUG_LEVEL=0
|
COPT = -Wall -fpic -g -pg -no-pie -DDEBUG_LEVEL=0
|
||||||
OBJS = fimg-core.o fimg-pnm.o fimg-file.o fimg-math.o \
|
OBJS = fimg-core.o fimg-pnm.o fimg-file.o fimg-math.o \
|
||||||
fimg-timers.o
|
fimg-timers.o operators.o
|
||||||
DEPS = Makefile ../floatimg.h
|
DEPS = Makefile ../floatimg.h
|
||||||
|
|
||||||
# modify it 'as you like'
|
# modify it 'as you like'
|
||||||
@ -13,7 +13,7 @@ AR=ar
|
|||||||
all: $(OBJS) ../libfloatimg.a
|
all: $(OBJS) ../libfloatimg.a
|
||||||
|
|
||||||
t: t.c ../libfloatimg.a $(DEPS)
|
t: t.c ../libfloatimg.a $(DEPS)
|
||||||
gcc $(COPT) $< ../libfloatimg.a -o $@
|
gcc $(COPT) $< ../libfloatimg.a -lm -o $@
|
||||||
|
|
||||||
# --------------------------------------------
|
# --------------------------------------------
|
||||||
|
|
||||||
@ -23,6 +23,9 @@ t: t.c ../libfloatimg.a $(DEPS)
|
|||||||
fimg-core.o: fimg-core.c $(DEPS)
|
fimg-core.o: fimg-core.c $(DEPS)
|
||||||
gcc $(COPT) -c $<
|
gcc $(COPT) -c $<
|
||||||
|
|
||||||
|
operators.o: operators.c $(DEPS)
|
||||||
|
gcc $(COPT) -c $<
|
||||||
|
|
||||||
fimg-pnm.o: fimg-pnm.c $(DEPS)
|
fimg-pnm.o: fimg-pnm.c $(DEPS)
|
||||||
gcc $(COPT) -c $<
|
gcc $(COPT) -c $<
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ fprintf(stderr, ">>> %-25s ( %p '%s' %d )\n", __func__, fimg,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (3 != fimg->type) {
|
if (3 != fimg->type) {
|
||||||
fprintf(stderr, "%s : bat type %d\n", __func__, fimg->type);
|
fprintf(stderr, "%s : bad type %d\n", __func__, fimg->type);
|
||||||
return -8;
|
return -8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ int fimg_load_from_pnm(char *fname, FloatImg *head, int notused)
|
|||||||
FILE *fp;
|
FILE *fp;
|
||||||
int width, height, maxval;
|
int width, height, maxval;
|
||||||
int foo, line, column;
|
int foo, line, column;
|
||||||
unsigned char *buffline, *idxrd;
|
unsigned char *buffline, *idxrd, dummychar;
|
||||||
float *Rptr, *Gptr, *Bptr;
|
float *Rptr, *Gptr, *Bptr;
|
||||||
|
|
||||||
if (NULL==head) {
|
if (NULL==head) {
|
||||||
@ -56,7 +56,12 @@ if (foo) {
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fread(&dummychar, 1, 1, fp);
|
||||||
|
fprintf(stderr, "%s : dummychar %xx\n", __func__, dummychar);
|
||||||
|
#else
|
||||||
fseek(fp, 1L, SEEK_CUR); /* black magic */
|
fseek(fp, 1L, SEEK_CUR); /* black magic */
|
||||||
|
#endif
|
||||||
|
|
||||||
Rptr = head->R; Gptr = head->G; Bptr = head->B;
|
Rptr = head->R; Gptr = head->G; Bptr = head->B;
|
||||||
for (line=0; line<height; line++) {
|
for (line=0; line<height; line++) {
|
||||||
@ -89,7 +94,7 @@ fprintf(stderr, ">>> %-25s ( %p '%s' %d )\n", __func__, head,
|
|||||||
fname, notused);
|
fname, notused);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (head->type != 3) {
|
if (head->type != FIMG_TYPE_RGB) {
|
||||||
#if DEBUG_LEVEL
|
#if DEBUG_LEVEL
|
||||||
fprintf(stderr, "%s : type %d is bad.\n", __func__, head->type);
|
fprintf(stderr, "%s : type %d is bad.\n", __func__, head->type);
|
||||||
#endif
|
#endif
|
||||||
|
95
lib/operators.c
Normal file
95
lib/operators.c
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/*
|
||||||
|
* OPERATORS
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "../floatimg.h"
|
||||||
|
|
||||||
|
extern int verbosity; /* must be declared around main() */
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
int fimg_add(FloatImg *a, FloatImg *b, FloatImg *d)
|
||||||
|
{
|
||||||
|
int idx, nbiter;
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, ">>> %s ( %p %p %p )\n", __func__, a, b, d);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (3 != a->type || 3 != b->type || 3 != d->type) {
|
||||||
|
fprintf(stderr, "%s : got a bad type fimg\n", __func__);
|
||||||
|
return -8;
|
||||||
|
}
|
||||||
|
|
||||||
|
nbiter = a->width * a->height;
|
||||||
|
|
||||||
|
for (idx=0; idx<nbiter; idx++) {
|
||||||
|
d->R[idx] = a->R[idx] + b->R[idx];
|
||||||
|
d->G[idx] = a->G[idx] + b->G[idx];
|
||||||
|
d->B[idx] = a->B[idx] + b->B[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* A - B -> D
|
||||||
|
*/
|
||||||
|
int fimg_sub(FloatImg *a, FloatImg *b, FloatImg *d)
|
||||||
|
{
|
||||||
|
int idx, nbiter;
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, ">>> %s ( %p %p %p )\n", __func__, a, b, d);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (3 != a->type || 3 != b->type || 3 != d->type) {
|
||||||
|
fprintf(stderr, "%s : got a bad type fimg\n", __func__);
|
||||||
|
return -8;
|
||||||
|
}
|
||||||
|
|
||||||
|
nbiter = a->width * a->height;
|
||||||
|
|
||||||
|
for (idx=0; idx<nbiter; idx++) {
|
||||||
|
d->R[idx] = fabs(a->R[idx] - b->R[idx]);
|
||||||
|
d->G[idx] = fabs(a->G[idx] - b->G[idx]);
|
||||||
|
d->B[idx] = fabs(a->B[idx] - b->B[idx]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* A * B -> D
|
||||||
|
*/
|
||||||
|
int fimg_mul(FloatImg *a, FloatImg *b, FloatImg *d)
|
||||||
|
{
|
||||||
|
int idx, nbiter;
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, ">>> %s ( %p %p %p )\n", __func__, a, b, d);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (3 != a->type || 3 != b->type || 3 != d->type) {
|
||||||
|
fprintf(stderr, "%s : got a bad type fimg\n", __func__);
|
||||||
|
return -8;
|
||||||
|
}
|
||||||
|
|
||||||
|
nbiter = a->width * a->height;
|
||||||
|
|
||||||
|
for (idx=0; idx<nbiter; idx++) {
|
||||||
|
d->R[idx] = a->R[idx] * b->R[idx];
|
||||||
|
d->G[idx] = a->G[idx] * b->G[idx];
|
||||||
|
d->B[idx] = a->B[idx] * b->B[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
/* ---------------------------------------------------------------- */
|
54
lib/t.c
54
lib/t.c
@ -2,35 +2,63 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#include "../floatimg.h"
|
#include "../floatimg.h"
|
||||||
|
|
||||||
int verbosity;
|
int verbosity;
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
int petit_dessin(FloatImg *img)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
float r, g, b;
|
||||||
|
|
||||||
|
for (y=0; y<img->height; y++) {
|
||||||
|
|
||||||
|
r = (float)y / (float)img->height;
|
||||||
|
|
||||||
|
for (x=0; x<img->width; x++) {
|
||||||
|
|
||||||
|
g = (float)x / (float)img->width;
|
||||||
|
b = 0.0;;
|
||||||
|
|
||||||
|
fimg_plot_rgb(img, x, y, r, g, b);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int foo;
|
int foo;
|
||||||
FloatImg fimg;
|
FloatImg dessin, noise, result;
|
||||||
int datas[3];
|
int datas[3];
|
||||||
char *fname = "foo.fimg";
|
|
||||||
verbosity = 1;
|
verbosity = 1;
|
||||||
|
|
||||||
fimg_print_version(0);
|
fimg_print_version(1);
|
||||||
|
|
||||||
foo = fimg_create(&fimg, 640, 480, 3);
|
foo = fimg_create(&dessin, 640, 480, 3);
|
||||||
printf("retour fimg_create ---> %d\n", foo);
|
petit_dessin(&dessin);
|
||||||
|
fimg_save_as_pnm(&dessin, "dessin.pnm", 0);
|
||||||
|
|
||||||
fimg_printhead(&fimg);
|
foo = fimg_create(&noise, 640, 480, 3);
|
||||||
fimg_describe(&fimg, "vroum");
|
fimg_drand48(&noise, 1.0);
|
||||||
|
fimg_save_as_pnm(&noise, "noise.pnm", 0);
|
||||||
|
|
||||||
// fimg_save_as_pnm(&fimg, "foo.pnm", 0);
|
foo = fimg_create(&result, 640, 480, 3);
|
||||||
foo = fimg_dump_to_file(&fimg, fname, 0);
|
|
||||||
|
|
||||||
foo = fimg_fileinfos("foo.fimg", datas);
|
foo = fimg_add(&dessin, &noise, &result);
|
||||||
|
fimg_save_as_pnm(&result, "r_add.pnm", 0);
|
||||||
printf("%s : largeur %d hauteur %d type %d\n",
|
foo = fimg_sub(&dessin, &noise, &result);
|
||||||
fname, datas[0], datas[1], datas[2]);
|
fimg_save_as_pnm(&result, "r_sub.pnm", 0);
|
||||||
|
foo = fimg_mul(&dessin, &noise, &result);
|
||||||
|
fimg_save_as_pnm(&result, "r_mul.pnm", 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user