forked from tTh/FloatImg
first shoot
This commit is contained in:
commit
5a72327882
12
.gitignore
vendored
Normal file
12
.gitignore
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
lib/*.o
|
||||||
|
funcs/*.o
|
||||||
|
|
||||||
|
*.a
|
||||||
|
|
||||||
|
tools/fimg2png
|
||||||
|
tools/fimg2pnm
|
||||||
|
tools/fimgstats
|
||||||
|
tools/mkfimg
|
||||||
|
tools/png2fimg
|
||||||
|
tools/addtga2fimg
|
33
Makefile
Normal file
33
Makefile
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
|
||||||
|
# Before running make, you must have
|
||||||
|
# a look to the 'build.sh' script !
|
||||||
|
|
||||||
|
COPT = -Wall -fpic -g -pg -DDEBUG_LEVEL=0
|
||||||
|
LDOPT = libfloatimg.a -pg -lm
|
||||||
|
|
||||||
|
all: essai
|
||||||
|
|
||||||
|
#---------------------------------------------------------------
|
||||||
|
|
||||||
|
exemple: exemple.c libfloatimg.a floatimg.h Makefile
|
||||||
|
gcc $(COPT) $< $(LDOPT) -o $@
|
||||||
|
|
||||||
|
essai: essai.c libfloatimg.a floatimg.h Makefile
|
||||||
|
gcc $(COPT) $< $(LDOPT) -lpnglite -o $@
|
||||||
|
|
||||||
|
#---------------------------------------------------------------
|
||||||
|
|
||||||
|
TOTAR = *.[ch] Makefile *.sh *.txt doc/*.tex \
|
||||||
|
funcs/*.[ch] funcs/Makefile \
|
||||||
|
tools/*.[ch] tools/Makefile \
|
||||||
|
lib/*.[ch] lib/Makefile
|
||||||
|
|
||||||
|
lines: $(TOTAR)
|
||||||
|
@wc $(TOTAR) | sort -n
|
||||||
|
|
||||||
|
tarball: $(TOTAR)
|
||||||
|
date > tarball
|
||||||
|
ls $(TOTAR) | sed 's/^/Fimg\//' > MANIFEST
|
||||||
|
( cd .. ; tar zcvf floatimg.tar.gz `cat Fimg/MANIFEST` )
|
||||||
|
|
||||||
|
#---------------------------------------------------------------
|
33
build.sh
Executable file
33
build.sh
Executable file
@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
cd lib
|
||||||
|
echo EEEEEEEEEE we are in $PWD
|
||||||
|
make
|
||||||
|
error=$?
|
||||||
|
if [ 0 -ne $error ]; then
|
||||||
|
printf "in %s err %d in %s\n" $PWD $error $0
|
||||||
|
exit $error
|
||||||
|
fi
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
cd funcs
|
||||||
|
echo EEEEEEEEEE we are in $PWD
|
||||||
|
make
|
||||||
|
error=$?
|
||||||
|
if [ 0 -ne $error ]; then
|
||||||
|
printf "in %s err %d in %s\n" $PWD $error $0
|
||||||
|
exit $error
|
||||||
|
fi
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
cd tools
|
||||||
|
echo
|
||||||
|
make fimg2pnm addtga2fimg mkfimg png2fimg fimgstats fimg2png
|
||||||
|
error=$?
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
echo
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
100
essai.c
Normal file
100
essai.c
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
testing some random funcs.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "floatimg.h"
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
int add(FloatImg *a, FloatImg *b)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
int offset;
|
||||||
|
double tb;
|
||||||
|
|
||||||
|
fimg_timer_set(0);
|
||||||
|
|
||||||
|
for (x=0; x<a->width; x++) {
|
||||||
|
for (y=0; y<a->height; y++) {
|
||||||
|
offset = x + (y * a->width);
|
||||||
|
a->R[offset] += b->R[offset];
|
||||||
|
a->G[offset] += b->G[offset];
|
||||||
|
a->B[offset] += b->B[offset];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tb = fimg_timer_get(0);
|
||||||
|
fprintf(stderr, "%s = %f seconds\n", __func__, tb);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
void fait_un_dessin(char *fname)
|
||||||
|
{
|
||||||
|
FloatImg dessin;
|
||||||
|
double tb;
|
||||||
|
|
||||||
|
puts("");
|
||||||
|
fimg_timer_set(0);
|
||||||
|
fimg_create(&dessin, 3200, 2400, 3);
|
||||||
|
fimg_draw_something(&dessin);
|
||||||
|
fimg_dump_to_file(&dessin, "dessin.fimg", 0);
|
||||||
|
fimg_destroy(&dessin);
|
||||||
|
tb = fimg_timer_get(0);
|
||||||
|
fprintf(stderr, "%s = %f seconds\n", __func__, tb);
|
||||||
|
|
||||||
|
puts("");
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
FloatImg fimgA, fimgB;
|
||||||
|
int foo;
|
||||||
|
double tb;
|
||||||
|
|
||||||
|
fimg_print_version(0);
|
||||||
|
|
||||||
|
#define W 2000
|
||||||
|
#define H 1700
|
||||||
|
|
||||||
|
fait_un_dessin("dessin.fimg");
|
||||||
|
|
||||||
|
fimg_create(&fimgA, W, H, 3);
|
||||||
|
fimg_create(&fimgB, W, H, 3);
|
||||||
|
|
||||||
|
fimg_draw_something(&fimgA);
|
||||||
|
|
||||||
|
fimg_timer_set(0);
|
||||||
|
fimg_drand48(&fimgB, 100.0);
|
||||||
|
tb = fimg_timer_get(0);
|
||||||
|
fprintf(stderr, "%s = %f seconds\n", __func__, tb);
|
||||||
|
|
||||||
|
foo = fimg_save_as_pnm(&fimgB, "drand48.pnm", 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
fimg_printhead(&fimgA); fimg_printhead(&fimgB);
|
||||||
|
fimg_describe(&fimgA, "image A");
|
||||||
|
*/
|
||||||
|
|
||||||
|
add(&fimgA, &fimgB);
|
||||||
|
|
||||||
|
foo = fimg_save_as_pnm(&fimgA, "t.pnm", 0);
|
||||||
|
fprintf(stderr, "save as pnm -> %d\n", foo);
|
||||||
|
foo = fimg_dump_to_file(&fimgA, "t.fimg", 0);
|
||||||
|
fprintf(stderr, "save as fimg -> %d\n", foo);
|
||||||
|
|
||||||
|
fimg_destroy(&fimgA);
|
||||||
|
fimg_destroy(&fimgB);
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
71
floatimg.h
Normal file
71
floatimg.h
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* floatimg.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define FIMG_VERSION 58
|
||||||
|
|
||||||
|
/*
|
||||||
|
* in memory descriptor
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
int type;
|
||||||
|
float fval;
|
||||||
|
int count;
|
||||||
|
|
||||||
|
float *R, *G, *B, *A;
|
||||||
|
|
||||||
|
int reserved;
|
||||||
|
} FloatImg;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* fimg file header
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
// char magic[8];
|
||||||
|
int w, h, t;
|
||||||
|
} FimgFhead;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* core module
|
||||||
|
*/
|
||||||
|
int fimg_create(FloatImg *fimg, int w, int h, int t);
|
||||||
|
int fimg_destroy(FloatImg *fimg);
|
||||||
|
|
||||||
|
int fimg_print_version(int k);
|
||||||
|
void fimg_printhead(FloatImg *h);
|
||||||
|
int fimg_describe(FloatImg *head, char *txt);
|
||||||
|
int fimg_fileinfo(char *fname, int *datas);
|
||||||
|
int fimg_plot_rgb (FloatImg *head, int x, int y, float r, float g, float b);
|
||||||
|
int fimg_clear(FloatImg *fimg);
|
||||||
|
int fimg_add_rgb(FloatImg *head, int x, int y, float r, float g, float b);
|
||||||
|
|
||||||
|
/* PNM files module */
|
||||||
|
int fimg_save_as_pnm(FloatImg *head, char *fname, int notused);
|
||||||
|
|
||||||
|
double fimg_timer_set(int whot);
|
||||||
|
double fimg_timer_get(int whot);
|
||||||
|
|
||||||
|
|
||||||
|
/* FIMG files module */
|
||||||
|
int fimg_fileinfos(char *fname, int *datas);
|
||||||
|
int fimg_dump_to_file(FloatImg *head, char *fname, int notused);
|
||||||
|
int fimg_create_from_dump(char *fname, FloatImg *head);
|
||||||
|
|
||||||
|
/* mathematics oprations */
|
||||||
|
float fimg_get_maxvalue(FloatImg *head);
|
||||||
|
int fimg_meanvalues(FloatImg *head, float means[4]);
|
||||||
|
int fimg_to_gray(FloatImg *head);
|
||||||
|
void fimg_add_cste(FloatImg *fi, float value);
|
||||||
|
void fimg_drand48(FloatImg *fi, float kmul);
|
||||||
|
|
||||||
|
/* variuos funcs modules */
|
||||||
|
int fimg_load_from_png(char *filename, FloatImg *fimg);
|
||||||
|
int fimg_create_from_png(char *filename, FloatImg *fimg);
|
||||||
|
int fimg_save_as_png(FloatImg *src, char *outname, int flags);
|
||||||
|
|
||||||
|
int fimg_draw_something(FloatImg *fimg);
|
||||||
|
|
||||||
|
|
||||||
|
|
22
funcs/Makefile
Normal file
22
funcs/Makefile
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#---------------------------------------------------------------
|
||||||
|
|
||||||
|
COPT = -Wall -fpic -g -no-pie -pg -DDEBUG_LEVEL=0
|
||||||
|
DEPS = ../floatimg.h Makefile
|
||||||
|
OBJS = fimg-png.o fimg-tiff.o misc-plots.o filtrage.o
|
||||||
|
|
||||||
|
#---------------------------------------------------------------
|
||||||
|
|
||||||
|
../libfloatimg.a: $(OBJS)
|
||||||
|
$(AR) r $@ $?
|
||||||
|
|
||||||
|
fimg-png.o: fimg-png.c $(DEPS)
|
||||||
|
gcc $(COPT) -c $<
|
||||||
|
|
||||||
|
fimg-tiff.o: fimg-tiff.c $(DEPS)
|
||||||
|
gcc $(COPT) -c $<
|
||||||
|
|
||||||
|
misc-plots.o: misc-plots.c $(DEPS)
|
||||||
|
gcc $(COPT) -c $<
|
||||||
|
|
||||||
|
filtrage.o: filtrage.c $(DEPS)
|
||||||
|
gcc $(COPT) -c $<
|
17
funcs/filtrage.c
Normal file
17
funcs/filtrage.c
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
|
#include "floatimg.h"
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------- */
|
||||||
|
int fimg_lissage_2x2(FloatImg *img)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
/* -------------------------------------------------------------------- */
|
||||||
|
|
162
funcs/fimg-png.c
Normal file
162
funcs/fimg-png.c
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
/*
|
||||||
|
* Lecture des images PNG
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <pnglite.h>
|
||||||
|
|
||||||
|
#include "../floatimg.h"
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* warning : this func has been tested only with
|
||||||
|
* RGB (3x8bits) PNG files
|
||||||
|
*/
|
||||||
|
int fimg_create_from_png(char *filename, FloatImg *fimg)
|
||||||
|
{
|
||||||
|
png_t png;
|
||||||
|
int foo, idx;
|
||||||
|
unsigned char *datas, *ptr;
|
||||||
|
int datasize;
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, ">>> %-25s ( '%s' %p )\n", __func__, filename, fimg);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
memset(&png, 0, sizeof(png_t));
|
||||||
|
png_init(NULL, NULL); /* this is VITAL ! */
|
||||||
|
|
||||||
|
foo = png_open_file_read(&png, filename);
|
||||||
|
if (PNG_NO_ERROR != foo) {
|
||||||
|
fprintf(stderr, "%s open_file '%s' -> %d\n", __func__, filename, foo);
|
||||||
|
return foo;
|
||||||
|
}
|
||||||
|
#if DEBUG_LEVEL > 1
|
||||||
|
fprintf(stderr, "%s opened\n", filename);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
datasize = png.width * png.height * png.bpp;
|
||||||
|
|
||||||
|
if ( 3 != png.bpp ) {
|
||||||
|
fprintf(stderr, "format %d of '%s' not supported\n",
|
||||||
|
png.color_type, filename);
|
||||||
|
return -21;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
printf("\t%s is %d x %d\n", filename, png.width, png.height);
|
||||||
|
printf("\tdatalen %d\n", png.png_datalen);
|
||||||
|
printf("\tcolor type %d\n", png.color_type);
|
||||||
|
printf("\tbyte/pixel %d\n", png.bpp);
|
||||||
|
printf("\tdatasize %d\n", datasize);
|
||||||
|
puts(""); png_print_info(&png); puts("");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
datas = malloc(datasize);
|
||||||
|
if (NULL==datas) {
|
||||||
|
fprintf(stderr, "%s : fatal memory failure\n", __func__);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(fimg, 0, sizeof(FloatImg));
|
||||||
|
foo = fimg_create(fimg, png.width, png.height, 3);
|
||||||
|
if (foo) {
|
||||||
|
fprintf(stderr, "can't create fimg\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
foo = png_get_data(&png, datas);
|
||||||
|
if (PNG_NO_ERROR != foo) {
|
||||||
|
fprintf(stderr, "error in '%s' : read png -> %d\n",
|
||||||
|
__func__, foo);
|
||||||
|
return foo;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = datas;
|
||||||
|
for (idx=0; idx<png.width * png.height; idx++) {
|
||||||
|
fimg->R[idx] = (float)*ptr++;
|
||||||
|
fimg->G[idx] = (float)*ptr++;
|
||||||
|
fimg->B[idx] = (float)*ptr++;
|
||||||
|
}
|
||||||
|
free(datas);
|
||||||
|
|
||||||
|
png_close_file(&png);
|
||||||
|
// fprintf(stderr, "png closed...\n");
|
||||||
|
return foo;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* warning : this func has been tested only with
|
||||||
|
* RGB (3x8bits) PNG files
|
||||||
|
*/
|
||||||
|
int fimg_load_from_png(char *filename, FloatImg *fimg)
|
||||||
|
{
|
||||||
|
png_t png;
|
||||||
|
int foo, idx, datasize;
|
||||||
|
unsigned char *datas, *ptr;
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, ">>> %-25s ( '%s' %p )\n", __func__, filename, fimg);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
memset(&png, 0, sizeof(png_t));
|
||||||
|
png_init(NULL, NULL); /* this is VITAL ! */
|
||||||
|
|
||||||
|
foo = png_open_file_read(&png, filename);
|
||||||
|
if (PNG_NO_ERROR != foo) {
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, "open png -> %d\n", foo);
|
||||||
|
#endif
|
||||||
|
return foo;
|
||||||
|
}
|
||||||
|
|
||||||
|
// puts(""); png_print_info(&png); puts("");
|
||||||
|
|
||||||
|
if ( 3 != png.bpp ) { /* TO BE PATCHED */
|
||||||
|
fprintf(stderr, "format of '%s' not supported\n", filename);
|
||||||
|
return -21;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check if floatimg and PNG have the same size */
|
||||||
|
if ((fimg->width != png.width) || (fimg->height != png.height)) {
|
||||||
|
fprintf(stderr, "%s : fatal error on images sizes\n", __func__);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
datasize = png.width * png.height * png.bpp;
|
||||||
|
datas = malloc(datasize);
|
||||||
|
if (NULL==datas) {
|
||||||
|
fprintf(stderr, "%s : fatal memory failure\n", __func__);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
foo = png_get_data(&png, datas);
|
||||||
|
if (PNG_NO_ERROR != foo) {
|
||||||
|
fprintf(stderr, "error in '%s' : read png -> %d\n",
|
||||||
|
__func__, foo);
|
||||||
|
return foo;
|
||||||
|
}
|
||||||
|
ptr = datas;
|
||||||
|
for (idx=0; idx<png.width * png.height; idx++) {
|
||||||
|
fimg->R[idx] = (float)*ptr++;
|
||||||
|
fimg->G[idx] = (float)*ptr++;
|
||||||
|
fimg->B[idx] = (float)*ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(datas);
|
||||||
|
png_close_file(&png);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int fimg_save_as_png(FloatImg *src, char *outname, int flags)
|
||||||
|
{
|
||||||
|
png_t png;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
12
funcs/fimg-tiff.c
Normal file
12
funcs/fimg-tiff.c
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
/*
|
||||||
|
* FLOATIMG
|
||||||
|
* import/export to/from TIFF files
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "../floatimg.h"
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
/* --------------------------------------------------------------------- */
|
57
funcs/misc-plots.c
Normal file
57
funcs/misc-plots.c
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
testing some random funcs.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "../floatimg.h"
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int fimg_draw_something(FloatImg *fimg)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
float fx, fy;
|
||||||
|
|
||||||
|
#define K (3.14159*13.456)
|
||||||
|
#define M 100.0
|
||||||
|
|
||||||
|
for (x=0; x<fimg->width; x++) {
|
||||||
|
fimg_plot_rgb(fimg, x, 0,
|
||||||
|
(float)x,
|
||||||
|
(float)x + 5.678,
|
||||||
|
(float)x * 1.33333);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (y=1; y<fimg->height; y++) {
|
||||||
|
fy = (float)y / (float)fimg->height;
|
||||||
|
for (x=0; x<fimg->width; x++) {
|
||||||
|
fx = (float)x / (float)fimg->width;
|
||||||
|
fimg_plot_rgb(fimg, x, y,
|
||||||
|
M*(cos(fx*K)+1.2),
|
||||||
|
M*(cos(fy*K)+1.2),
|
||||||
|
M*(cos(fx*fy)+1.2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
int fimg_multirandom(FloatImg *fimg)
|
||||||
|
{
|
||||||
|
int foo, x, y;
|
||||||
|
|
||||||
|
#define RI ( (rand()/7) + (rand()/9) )
|
||||||
|
#define RD ( (drand48()/7) + (drand48()/7) )
|
||||||
|
|
||||||
|
for (foo=0; foo<100000000; foo++)
|
||||||
|
{
|
||||||
|
x = RI % fimg->width;
|
||||||
|
y = RI % fimg->height;
|
||||||
|
fimg_add_rgb(fimg, x, y, RD, RD, RD);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
12
install.sh
Executable file
12
install.sh
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
cp libfloatimg.a /usr/local/lib
|
||||||
|
cp floatimg.h /usr/local/include
|
||||||
|
|
||||||
|
cp tools/mkfimg tools/fimg2pnm tools/addtga2fimg \
|
||||||
|
tools/png2fimg tools/fimgstats \
|
||||||
|
/usr/local/bin
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
35
lib/Makefile
Normal file
35
lib/Makefile
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#
|
||||||
|
# building the base library
|
||||||
|
#
|
||||||
|
|
||||||
|
COPT = -Wall -fpic -g -pg -no-pie -DDEBUG_LEVEL=0
|
||||||
|
OBJS = fimg-core.o fimg-pnm.o fimg-file.o fimg-math.o \
|
||||||
|
fimg-timers.o
|
||||||
|
DEPS = Makefile ../floatimg.h
|
||||||
|
|
||||||
|
# modify it 'as you like'
|
||||||
|
AR=ar
|
||||||
|
|
||||||
|
all: $(OBJS) ../libfloatimg.a
|
||||||
|
|
||||||
|
# --------------------------------------------
|
||||||
|
|
||||||
|
../libfloatimg.a: $(OBJS)
|
||||||
|
$(AR) r $@ $?
|
||||||
|
|
||||||
|
fimg-core.o: fimg-core.c $(DEPS)
|
||||||
|
gcc $(COPT) -c $<
|
||||||
|
|
||||||
|
fimg-pnm.o: fimg-pnm.c $(DEPS)
|
||||||
|
gcc $(COPT) -c $<
|
||||||
|
|
||||||
|
fimg-file.o: fimg-file.c $(DEPS)
|
||||||
|
gcc $(COPT) -c $<
|
||||||
|
|
||||||
|
fimg-math.o: fimg-math.c $(DEPS)
|
||||||
|
gcc $(COPT) -c $<
|
||||||
|
|
||||||
|
fimg-timers.o: fimg-timers.c $(DEPS)
|
||||||
|
gcc $(COPT) -c $<
|
||||||
|
|
||||||
|
# --------------------------------------------
|
189
lib/fimg-core.c
Normal file
189
lib/fimg-core.c
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
/*
|
||||||
|
* fimg-core.c
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "string.h"
|
||||||
|
|
||||||
|
#include "../floatimg.h"
|
||||||
|
|
||||||
|
extern int verbosity; /* must be declared around main() */
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
static int fimg_type_is_valid(int t)
|
||||||
|
{
|
||||||
|
switch (t) {
|
||||||
|
case 1: case 3: case 4: return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
int fimg_print_version(int k)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "*** FloatImg library, alpha v%d (%s, %s)\n",
|
||||||
|
FIMG_VERSION, __DATE__, __TIME__);
|
||||||
|
|
||||||
|
if (51 == k) {
|
||||||
|
puts("+--------------------+");
|
||||||
|
puts("| Pastis is coming. |");
|
||||||
|
puts("+--------------------+");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
void fimg_printhead(FloatImg *h)
|
||||||
|
{
|
||||||
|
printf("%5d %5d %2d %p %p %p %p\n", h->width, h->height, h->type,
|
||||||
|
h->R, h->G, h->B, h->A);
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
int fimg_describe(FloatImg *head, char *txt)
|
||||||
|
{
|
||||||
|
printf("----- '%s' at %p -----\n", txt, head);
|
||||||
|
|
||||||
|
if( ! fimg_type_is_valid(head->type) ) {
|
||||||
|
fprintf(stderr, "*** %s *** type %d invalid *** %s ***\n",
|
||||||
|
__func__, head->type, txt);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf(" size %d x %d x %d\n",
|
||||||
|
head->width, head->height, head->type);
|
||||||
|
printf(" fval/count %f %d\n", head->fval, head->count);
|
||||||
|
printf(" pixels@ %p %p %p %p\n",
|
||||||
|
head->R, head->G, head->B, head->A);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int fimg_create(FloatImg *fimg, int w, int h, int t)
|
||||||
|
{
|
||||||
|
int surface, size;
|
||||||
|
float *fptr;
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, ">>> %-25s ( %p %d %d %d )\n", __func__, fimg, w, h, t);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ( ! fimg_type_is_valid(t) ) {
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
memset(fimg, 0, sizeof(FloatImg));
|
||||||
|
|
||||||
|
surface = w * h;
|
||||||
|
size = surface * t * sizeof(float);
|
||||||
|
#if DEBUG_LEVEL > 1
|
||||||
|
fprintf(stderr, "surface is %d pixels, need %d bytes\n", surface, size);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fptr = (float *)malloc(size);
|
||||||
|
if (NULL==fptr) {
|
||||||
|
fprintf(stderr, "%s : nom mem, exiting.\n", __func__);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL > 1
|
||||||
|
fprintf(stderr, " got %d bytes at %p\n", size, fptr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fimg->width = w; fimg->height = h;
|
||||||
|
fimg->type = t;
|
||||||
|
|
||||||
|
fimg->R = fptr;
|
||||||
|
if ( (t==3) || (t==4) ) {
|
||||||
|
fimg->G = fptr + surface;
|
||||||
|
fimg->B = fptr + surface + surface;
|
||||||
|
}
|
||||||
|
if ( t==4 ) fimg->A = fptr + (3 * surface);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int fimg_destroy(FloatImg *fimg)
|
||||||
|
{
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, ">>> %-25s ( %p )\n", __func__, fimg);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ( ! fimg_type_is_valid(fimg->type) ) {
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(fimg->R);
|
||||||
|
memset(fimg, 0, sizeof(FloatImg));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
int fimg_clear(FloatImg *fimg)
|
||||||
|
{
|
||||||
|
int size;
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, ">>> %-25s ( %p )\n", __func__, fimg);
|
||||||
|
#endif
|
||||||
|
if ( ! fimg_type_is_valid(fimg->type) ) {
|
||||||
|
fprintf(stderr, "invalid type %d in %s\n", fimg->type, __func__);
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
size = fimg->width * fimg->height * fimg->type * sizeof(float);
|
||||||
|
memset(fimg->R, 0, size);
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int fimg_plot_rgb (FloatImg *head, int x, int y,
|
||||||
|
float r, float g, float b)
|
||||||
|
{
|
||||||
|
int offset;
|
||||||
|
|
||||||
|
if (head->type < 3) {
|
||||||
|
#if DEBUG_LEVEL > 1
|
||||||
|
fprintf(stderr, "%s : type %d is bad.\n", __func__, head->type);
|
||||||
|
#endif
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset = x + (y * head->width);
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL > 1
|
||||||
|
fprintf(stderr, ">>> %s ( %p %d %d %f )\n", __func__, head, x, y, gray);
|
||||||
|
fprintf(stderr, " offset %d\n", offset);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
head->R[offset] = r;
|
||||||
|
head->G[offset] = g;
|
||||||
|
head->B[offset] = b;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
int fimg_add_rgb(FloatImg *head, int x, int y, float r, float g, float b)
|
||||||
|
{
|
||||||
|
int offset;
|
||||||
|
offset = x + (y * head->width);
|
||||||
|
head->R[offset] += r;
|
||||||
|
head->G[offset] += g;
|
||||||
|
head->B[offset] += b;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
0
lib/fimg-core.h
Normal file
0
lib/fimg-core.h
Normal file
125
lib/fimg-file.c
Normal file
125
lib/fimg-file.c
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
/*
|
||||||
|
* fimg-file.c
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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_fileinfos(char *fname, int *datas)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, ">>> %-25s ( '%s' %p )\n", __func__, fname, datas);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fp = fopen(fname, "r");
|
||||||
|
if (NULL==fp) {
|
||||||
|
perror(fname);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (3 != fread(datas, sizeof(int), 3, fp)) {
|
||||||
|
fprintf(stderr, "%s: %s short read\n", __func__, fname);
|
||||||
|
fclose(fp);
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
int fimg_dump_to_file(FloatImg *head, char *fname, int notused)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
int foo, nbre, dims[3];
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, ">>> %-25s ( %p '%s' %d )\n", __func__, head,
|
||||||
|
fname, notused);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (3 != head->type) {
|
||||||
|
fprintf(stderr, "%s : bat type %d\n", __func__, head->type);
|
||||||
|
return -8;
|
||||||
|
}
|
||||||
|
|
||||||
|
fp = fopen(fname, "w");
|
||||||
|
if (NULL==fp) {
|
||||||
|
perror(fname);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dims[0] = head->width; dims[1] = head->height;
|
||||||
|
dims[2] = head->type;
|
||||||
|
|
||||||
|
foo = fwrite(dims, sizeof(int), 3, fp);
|
||||||
|
if (3 != foo) {
|
||||||
|
perror(fname);
|
||||||
|
fclose(fp);
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
nbre = head->width*head->height*3;
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, " %s : data at %p\n", __func__, head->R);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
foo = fwrite(head->R, sizeof(float), nbre, fp);
|
||||||
|
if (nbre!=foo) {
|
||||||
|
perror(fname);
|
||||||
|
fclose(fp);
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
int fimg_create_from_dump(char *fname, FloatImg *head)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
int foo, dims[3];
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, ">>> %-25s ( '%s' %p )\n", __func__, fname, head);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fp = fopen(fname, "r");
|
||||||
|
if (NULL==fp) {
|
||||||
|
perror(fname);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
foo = fread(dims, sizeof(int), 3, fp);
|
||||||
|
if (3 != foo) {
|
||||||
|
fprintf(stderr, "%s : short read\n", fname);
|
||||||
|
fclose(fp);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, "%s : got [ %d %d %d ] from '%s'\n", __func__,
|
||||||
|
dims[0], dims[1], dims[2], fname);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
foo = fimg_create(head, dims[0], dims[1], dims[2]);
|
||||||
|
if (foo) {
|
||||||
|
fprintf(stderr, "%s : create -> %d\n", __func__, foo);
|
||||||
|
return foo;
|
||||||
|
}
|
||||||
|
|
||||||
|
foo = fread(head->R, sizeof(float), dims[0]*dims[1]*3, fp);
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
99
lib/fimg-math.c
Normal file
99
lib/fimg-math.c
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* fimg-core.c
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "string.h"
|
||||||
|
|
||||||
|
#include "../floatimg.h"
|
||||||
|
|
||||||
|
extern int verbosity; /* must be declared around main() */
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
float fimg_get_maxvalue(FloatImg *head)
|
||||||
|
{
|
||||||
|
float maxval;
|
||||||
|
int foo;
|
||||||
|
|
||||||
|
maxval = 0.0; /* no negative values allowed */
|
||||||
|
|
||||||
|
for (foo=0; foo<(head->width*head->height); foo++) {
|
||||||
|
if (head->R[foo] > maxval) maxval = head->R[foo];
|
||||||
|
if (head->G[foo] > maxval) maxval = head->G[foo];
|
||||||
|
if (head->B[foo] > maxval) maxval = head->B[foo];
|
||||||
|
}
|
||||||
|
|
||||||
|
return maxval;
|
||||||
|
}
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
int fimg_meanvalues(FloatImg *head, float means[4])
|
||||||
|
{
|
||||||
|
int idx, surface;
|
||||||
|
|
||||||
|
surface = head->width * head->height;
|
||||||
|
if (surface < 1) return -1;
|
||||||
|
|
||||||
|
memset(means, 0, 4*sizeof(float));
|
||||||
|
|
||||||
|
for (idx=0; idx<surface; idx++) {
|
||||||
|
means[0] += head->R[idx];
|
||||||
|
if (head->type > 2) {
|
||||||
|
means[1] += head->G[idx];
|
||||||
|
means[2] += head->B[idx];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (idx=0; idx<4; idx++) means[idx] /= (float)surface;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
int fimg_to_gray(FloatImg *head)
|
||||||
|
{
|
||||||
|
float add;
|
||||||
|
int foo;
|
||||||
|
|
||||||
|
for (foo=0; foo<(head->width*head->height); foo++) {
|
||||||
|
add = head->R[foo];
|
||||||
|
add += head->G[foo];
|
||||||
|
add += head->B[foo];
|
||||||
|
head->R[foo] = head->G[foo] = head->B[foo] = add;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
void fimg_add_cste(FloatImg *fi, float value)
|
||||||
|
{
|
||||||
|
int nbre, idx;
|
||||||
|
|
||||||
|
nbre = fi->width * fi->height * fi->type;
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, "%s, nbre is %d\n", __func__, nbre);
|
||||||
|
#endif
|
||||||
|
for (idx=0; idx<nbre; nbre++) {
|
||||||
|
fi->R[idx] += value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* Warning: this function is _very_ slow */
|
||||||
|
void fimg_drand48(FloatImg *fi, float kmul)
|
||||||
|
{
|
||||||
|
int nbre, idx;
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, ">>> %s ( %p %g )\n", __func__, fi, kmul);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
nbre = fi->width * fi->height * fi->type;
|
||||||
|
for (idx=0; idx<nbre; idx++) {
|
||||||
|
fi->R[idx] = drand48() * kmul;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
76
lib/fimg-pnm.c
Normal file
76
lib/fimg-pnm.c
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* fimg-pnm.c
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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_save_as_pnm(FloatImg *head, char *fname, int notused)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
float maximum, fk;
|
||||||
|
int idx, sz, Rv, Gv, Bv, foo;
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, ">>> %-25s ( %p '%s' %d )\n", __func__, head,
|
||||||
|
fname, notused);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (head->type != 3) {
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, "%s : type %d is bad.\n", __func__, head->type);
|
||||||
|
#endif
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL==(fp=fopen(fname, "w"))) {
|
||||||
|
perror(fname);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(fp, "P3\n%d %d\n", head->width, head->height);
|
||||||
|
|
||||||
|
maximum = fimg_get_maxvalue(head);
|
||||||
|
fprintf(fp, "# maxval %15f\n", maximum);
|
||||||
|
fk = maximum / 65536.0;
|
||||||
|
fprintf(fp, "# divisor %15f\n", fk);
|
||||||
|
fprintf(fp, "65535\n");
|
||||||
|
sz = head->width*head->height;
|
||||||
|
|
||||||
|
foo = 0;
|
||||||
|
for (idx=0; idx<sz; idx++) {
|
||||||
|
if (fk > 0) {
|
||||||
|
Rv = (int)(head->R[idx] / fk);
|
||||||
|
Gv = (int)(head->G[idx] / fk);
|
||||||
|
Bv = (int)(head->B[idx] / fk);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Rv = Gv = Bv = 0;
|
||||||
|
}
|
||||||
|
foo += fprintf(fp, "%d %d %d", Rv, Gv, Bv);
|
||||||
|
if (foo > 60) {
|
||||||
|
fputs("\n", fp); foo = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fputs(" ", fp); foo++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fputs("\n", fp);
|
||||||
|
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* ---------------------------------------------------------------- */
|
43
lib/fimg-timers.c
Normal file
43
lib/fimg-timers.c
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* timers.c
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
extern int verbosity;
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------- */
|
||||||
|
static double dtime(void)
|
||||||
|
{
|
||||||
|
struct timeval t;
|
||||||
|
double d;
|
||||||
|
(void)gettimeofday(&t, NULL);
|
||||||
|
d = (double)t.tv_sec + (double)t.tv_usec / 1e6;
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
/* ----------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
static double memory_time;
|
||||||
|
|
||||||
|
double fimg_timer_set(int whot)
|
||||||
|
{
|
||||||
|
double current;
|
||||||
|
|
||||||
|
current = dtime();
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, "%s ( %d ) -> current %f\n", __func__, whot, current);
|
||||||
|
#endif
|
||||||
|
memory_time = current;
|
||||||
|
return memory_time;
|
||||||
|
}
|
||||||
|
/* ----------------------------------------------------------------- */
|
||||||
|
double fimg_timer_get(int whot)
|
||||||
|
{
|
||||||
|
double current;
|
||||||
|
current = dtime();
|
||||||
|
return current - memory_time;
|
||||||
|
}
|
||||||
|
/* ----------------------------------------------------------------- */
|
29
tools/Makefile
Normal file
29
tools/Makefile
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#
|
||||||
|
# makefile for floatimg tools
|
||||||
|
# use with caution
|
||||||
|
#
|
||||||
|
|
||||||
|
COPT = -Wall -fpic -g -DDEBUG_LEVEL=1
|
||||||
|
DEPS = ../floatimg.h ../libfloatimg.a Makefile
|
||||||
|
|
||||||
|
# ----------
|
||||||
|
|
||||||
|
fimgstats: fimgstats.c $(DEPS)
|
||||||
|
gcc -g $< ../libfloatimg.a -o $@
|
||||||
|
|
||||||
|
mkfimg: mkfimg.c $(DEPS)
|
||||||
|
gcc -g $< ../libfloatimg.a -o $@
|
||||||
|
|
||||||
|
fimg2pnm: fimg2pnm.c $(DEPS)
|
||||||
|
gcc -g $< ../libfloatimg.a -o $@
|
||||||
|
|
||||||
|
fimg2png: fimg2png.c $(DEPS)
|
||||||
|
gcc -g $< ../libfloatimg.a -o $@
|
||||||
|
|
||||||
|
addtga2fimg: addtga2fimg.c $(DEPS)
|
||||||
|
gcc -g $< ../libfloatimg.a -limageSO -lm -o $@
|
||||||
|
|
||||||
|
# if "undefined reference to crc32" then "use -lz"
|
||||||
|
png2fimg: png2fimg.c $(DEPS)
|
||||||
|
gcc -g $< ../libfloatimg.a -lpnglite -o $@
|
||||||
|
|
99
tools/addtga2fimg.c
Normal file
99
tools/addtga2fimg.c
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* ADDTGA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <tthimage.h>
|
||||||
|
|
||||||
|
#include "../floatimg.h"
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
int add_tga_to_fimg(char *srcname, char *dstname, int notused)
|
||||||
|
{
|
||||||
|
Image_Desc *src;
|
||||||
|
FloatImg dst;
|
||||||
|
int foo, x, y;
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, ">>> %s ( '%s' %s' )\n", __func__, srcname, dstname);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (NULL==(src = Image_TGA_alloc_load(srcname))) {
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
foo = fimg_create_from_dump(dstname, &dst);
|
||||||
|
if (foo) fprintf(stderr, "create fimg from '%s' -> %d\n", dstname, foo);
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fimg_describe(&dst, "created fimg");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (y=0; y<src->height; y++) {
|
||||||
|
for (x=0; x<src->width; x++) {
|
||||||
|
foo = fimg_add_rgb(&dst, x, y,
|
||||||
|
(float)Image_R_pixel(src, x, y),
|
||||||
|
(float)Image_G_pixel(src, x, y),
|
||||||
|
(float)Image_B_pixel(src, x, y));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foo = fimg_dump_to_file(&dst, dstname, 0);
|
||||||
|
if (foo) { fprintf(stderr, "fimg dump -> %d\n", foo); }
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int foo;
|
||||||
|
int tgaW, tgaH;
|
||||||
|
int infos[3];
|
||||||
|
|
||||||
|
if (3 != argc) {
|
||||||
|
fimg_print_version(1);
|
||||||
|
fprintf(stderr, "usage:\n\t%s img.tga cumul.fimg\n", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* first, check the TGA file dimensions */
|
||||||
|
// Image_print_version(0);
|
||||||
|
foo = Image_TGA_get_dims(argv[1], &tgaW, &tgaH);
|
||||||
|
if (foo) {
|
||||||
|
fprintf(stderr, "get dims of '%s' -> %d\n", argv[1], foo);
|
||||||
|
Image_print_error("tga get dims", foo);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( 0==access(argv[2], R_OK|W_OK) ) { /* fimg is readable */
|
||||||
|
// fprintf(stderr, "%s exist\n", argv[2]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "*** must create '%s' %dx%d first !!!\n",
|
||||||
|
argv[2], tgaW, tgaH);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
foo = fimg_fileinfos(argv[2], infos);
|
||||||
|
// fprintf(stderr, "get dims of '%s' -> %d\n", argv[2], foo);
|
||||||
|
if (foo) {
|
||||||
|
fprintf(stderr, "*** %s is badly broken\n", argv[2]);
|
||||||
|
exit(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (tgaW != infos[0]) || (tgaW != infos[0]) ) {
|
||||||
|
fprintf(stderr, " TGA %5d %5d\n", tgaW, tgaH);
|
||||||
|
fprintf(stderr, " FIMG %5d %5d\n", infos[0], infos[1]);
|
||||||
|
fprintf(stderr, " No dimension match.\n");
|
||||||
|
exit(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
foo = add_tga_to_fimg(argv[1], argv[2], 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
21
tools/fimg2png.c
Normal file
21
tools/fimg2png.c
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "../floatimg.h"
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int foo;
|
||||||
|
|
||||||
|
if (3 != argc) {
|
||||||
|
fimg_print_version(1);
|
||||||
|
fprintf(stderr, "usage:\n\t%s foo.fimg bar.pnm\n", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
62
tools/fimg2pnm.c
Normal file
62
tools/fimg2pnm.c
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "../floatimg.h"
|
||||||
|
|
||||||
|
int verbosity;
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
int convertir_fimg_en_pnm(char *srcname, char *dstname, int notused)
|
||||||
|
{
|
||||||
|
int foo, infos[3];
|
||||||
|
FloatImg fimg;
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, ">>> %25s ( '%s' '%s' )\n", __func__, srcname, dstname);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
foo = fimg_fileinfos(srcname, infos);
|
||||||
|
if (foo) { fprintf(stderr, "'%s' get dims -> %d\n", srcname, foo); }
|
||||||
|
|
||||||
|
if (verbosity) {
|
||||||
|
fprintf(stderr, "image '%s' is %d x %d\n",
|
||||||
|
srcname, infos[0], infos[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
foo = fimg_create_from_dump(srcname, &fimg);
|
||||||
|
if (foo) {
|
||||||
|
fprintf(stderr, "create fimg from '%s' -> %d\n", srcname, foo);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL > 1
|
||||||
|
print_floatimg(&fimg, "created fimg");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
foo = fimg_save_as_pnm(&fimg, dstname, 0);
|
||||||
|
if(foo) { fprintf(stderr, "%p to '%s' -> %d\n", &fimg, dstname, foo); }
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int foo;
|
||||||
|
|
||||||
|
if (3 != argc) {
|
||||||
|
fimg_print_version(1);
|
||||||
|
fprintf(stderr, "usage:\n\t%s foo.fimg bar.pnm\n", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( 0 != access(argv[1], R_OK|W_OK) ) { /* fimg is NOT readable */
|
||||||
|
fprintf(stderr, "%s: %s don't exist.\n", argv[0], argv[1]);
|
||||||
|
exit(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
foo = convertir_fimg_en_pnm(argv[1], argv[2], 0);
|
||||||
|
if (foo) fprintf(stderr, "conversion -> %d\n", foo);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
91
tools/fimgstats.c
Normal file
91
tools/fimgstats.c
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* FIMGSTATS
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "../floatimg.h"
|
||||||
|
|
||||||
|
int verbosity; /* global */
|
||||||
|
|
||||||
|
int make_csv;
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
int various_numbers(FloatImg *fimg, int k)
|
||||||
|
{
|
||||||
|
float moyennes[4];
|
||||||
|
int foo;
|
||||||
|
float fvalue;
|
||||||
|
|
||||||
|
if (verbosity)
|
||||||
|
fprintf(stderr, " numbers from %p :\n", fimg);
|
||||||
|
|
||||||
|
fimg_printhead(fimg);
|
||||||
|
fprintf(stderr, "surface %d\n", fimg->width * fimg->height);
|
||||||
|
|
||||||
|
fimg_meanvalues(fimg, moyennes);
|
||||||
|
fprintf(stderr, "mean values:\n");
|
||||||
|
for (foo=0; foo<4; foo++)
|
||||||
|
printf(" %c %14.6f\n", "RGBA"[foo], moyennes[foo]);
|
||||||
|
|
||||||
|
fvalue = fimg_get_maxvalue(fimg);
|
||||||
|
printf("max value %f\n", fvalue);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
int various_numbers_from_file(char *fname, int k)
|
||||||
|
{
|
||||||
|
FloatImg fimg;
|
||||||
|
int foo;
|
||||||
|
|
||||||
|
fprintf(stderr, "----------- numbers from '%s' :\n", fname);
|
||||||
|
|
||||||
|
foo = fimg_create_from_dump(fname, &fimg);
|
||||||
|
if (foo) {
|
||||||
|
fprintf(stderr, "create fimg from '%s' -> %d\n", fname, foo);
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
various_numbers(&fimg, k);
|
||||||
|
|
||||||
|
fimg_destroy(&fimg);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
static void help(int k)
|
||||||
|
{
|
||||||
|
fputs( "usage : fimgstats [options] file.fimg\n"
|
||||||
|
"\t-c\tmake a machinable csv\n"
|
||||||
|
"\t-v\tincrease verbosity\n"
|
||||||
|
, stderr);
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int foo, opt;
|
||||||
|
|
||||||
|
extern char *optarg;
|
||||||
|
extern int optind, opterr, optopt;
|
||||||
|
|
||||||
|
if (argc == 1) {
|
||||||
|
foo = fimg_print_version(1); help(0);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
while ((opt = getopt(argc, argv, "cv")) != -1) {
|
||||||
|
switch(opt) {
|
||||||
|
case 'c': make_csv++; break;
|
||||||
|
case 'v': verbosity++; break;
|
||||||
|
|
||||||
|
default: help(1); exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foo = various_numbers_from_file(argv[optind], 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
41
tools/mkfimg.c
Normal file
41
tools/mkfimg.c
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "../floatimg.h"
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int foo;
|
||||||
|
int width, height;
|
||||||
|
char *fname;
|
||||||
|
FloatImg fimg;
|
||||||
|
|
||||||
|
if (4 != argc) {
|
||||||
|
fimg_print_version(1);
|
||||||
|
fprintf(stderr, "Usage:\n\t%s quux.fimg width height\n", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
fname = argv[1];
|
||||||
|
width = atoi(argv[2]); height = atoi(argv[3]);
|
||||||
|
fprintf(stderr, "making %s %d x %d\n", fname, width, height);
|
||||||
|
|
||||||
|
foo = fimg_create(&fimg, width, height, 3);
|
||||||
|
if (foo) {
|
||||||
|
fprintf(stderr, "create floatimg -> %d\n", foo);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
fimg_describe(&fimg, "just a black flimg");
|
||||||
|
fimg_clear(&fimg);
|
||||||
|
|
||||||
|
foo = fimg_dump_to_file(&fimg, fname, 0);
|
||||||
|
if (foo) {
|
||||||
|
fprintf(stderr, "dump floatimg -> %d\n", foo);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
39
tools/png2fimg.c
Normal file
39
tools/png2fimg.c
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* PNG ---> FIMG
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "../floatimg.h"
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
FloatImg fimg;
|
||||||
|
int foo;
|
||||||
|
|
||||||
|
if (3 != argc) {
|
||||||
|
fimg_print_version(1);
|
||||||
|
fprintf(stderr, "usage:\n\t%s foo.fimg bar.png\n", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&fimg, 0, sizeof(FloatImg));
|
||||||
|
|
||||||
|
foo = fimg_create_from_png(argv[1], &fimg);
|
||||||
|
if (foo) {
|
||||||
|
fprintf(stderr, "%s : err %d, abort.\n", argv[0], foo);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fimg_describe(&fimg, "oups");
|
||||||
|
|
||||||
|
foo = fimg_save_as_pnm(&fimg, "t.pnm", 0);
|
||||||
|
fprintf(stderr, "save as pnm -> %d\n", foo);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* --------------------------------------------------------------------- */
|
Loading…
Reference in New Issue
Block a user