You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/chalk/colorspaces/wetsticky/ws/load_ppm.c

245 lines
5.4 KiB

/*
FILE: load_ppm.c
PURPOSE: Defines the routines to load a PPM portable pixmap image file.
AUTHOR: David England
VERSION: 1.00 (10-May-91)
Copyright 1991, 1992, 2002, 2003 Tunde Cockshott, Kevin Waite, David England.
Contact David England d.england@livjm.ac.uk
School of Computing and Maths Sciences,
Liverpool John Moores University
Liverpool L3 3AF
United Kingdom
Phone +44 151 231 2271
Wet and Sticky is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Wet and Sticky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Wet and Sticky; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "constants.h"
#include "types.h"
#include "canvas.h"
#include <ctype.h>
#include <ppm.h>
#include <ppmcmap.h>
/* Max number of colors allowed in ppm input. */
#define MAXCOLORS 256
extern CELL canvas[CANVAS_WIDTH][CANVAS_HEIGHT];
float
max_rgb(r,g,b)
float r;
float g;
float b;
{
if ((r > g) && (r > b))
return (r);
if ((b > g) && (b > r))
return (b);
if ((g > b) && (g > r))
return (g);
return(0);
}
float
min_rgb(r,g,b)
float r;
float g;
float b;
{
if ((r < g) && (b < g))
return (r);
if ((b < g) && (b < r))
return (b);
if ((g < b) && (g < r))
return (g);
return(0);
}
int
GetHue(red, green, blue) /* rgb to hls */
int red;
int green;
int blue;
{
float min_col, max_col;
float h,s,l;
float rc, gc, bc;
float r, g, b;
r = (float)red/255.0;
b = (float)green/255.0;
g = (float)blue/255.0;
max_col = (float)max_rgb(r, g, b);
min_col = (float)min_rgb(r, g, b);
l = (max_col + min_col)/2.0 ;
if ( max_col == min_col) {
s = 0.0;
h = 0.0;
} else {
if ( l < 0.5) {
s = (max_col - min_col)/(max_col + min_col);
} else s = (max_col - min_col)/(2 - max_col - min_col);
rc = (max_col -r)/( max_col - min_col);
gc = (max_col -g)/(max_col - min_col);
bc = (max_col -b)/(max_col - min_col);
if (r == max_col)
h = bc - gc;
else if (g == max_col )
h = 2 + rc - bc;
else if (b == max_col)
h = 4 + gc -rc;
h = h * 60;
if ( h < 0.0)
h = h + 360;
}
return ((int)h);
}
GetHuePaint(r,g,b)
int r;
int g;
int b;
{
/*if ((r == 0) && (g == 0) && (b ==0)) {
canvas[i][j].contents.liquid_content = 0;
canvas[i][j].contents.drying_rate = 0;
canvas[i][j].contents.miscibility = 0;
canvas[i][j].contents.colour.hue = 0;
canvas[i][j].contents.colour.saturation = 1.0;
canvas[i][j].contents.colour.lightness = 0.0;
canvas[i][j].volume = 80;
return (0);
}
if ((r == 255) && (g == 255) && ( b == 255)) {
canvas[i][j].contents.liquid_content = 0;
canvas[i][j].contents.drying_rate = 0;
canvas[i][j].contents.miscibility = 0;
canvas[i][j].contents.colour.hue = 128;
canvas[i][j].contents.colour.saturation = 1.0;
canvas[i][j].contents.colour.lightness = 0.0;
canvas[i][j].volume = 80;
return (128);
}*/
}
load_ppm_format(filename, width, height)
char *filename;
int *width;
int *height;
{
FILE* ifp;
pixel **pixels;
int rows, cols, i, j;
pixval maxval;
int red, green, blue;
int hue;
/*ppm_init( &argc, argv );*/
ifp = pm_openr( filename);
pixels = ppm_readppm( ifp, &cols, &rows, &maxval );
*(width) = cols;
*(height) = rows;
fprintf(stderr,"Loading file %s, %dx%d. Please wait ", filename, rows,
cols);
if (rows > CANVAS_HEIGHT)
rows = CANVAS_HEIGHT;
if (cols > CANVAS_WIDTH)
cols = CANVAS_WIDTH;
for (i=0; i< rows; i++) {
for (j=0; j< cols; j++) {
red = PPM_GETR(pixels[i][j]);
green = PPM_GETG(pixels[i][j]);
blue = PPM_GETB(pixels[i][j]);
/*hue = GetHue(red, green, blue);*/
/* For gray scale only */
hue = 255 - red;
/*fprintf(stderr,"hue %d ", hue);*/
/*GetHuePaint(red, green, blue, i, j);*/
canvas[i][j].contents.liquid_content = 80;
canvas[i][j].contents.drying_rate = 80;
canvas[i][j].contents.miscibility = 80;
canvas[i][j].contents.colour.hue = hue;
canvas[i][j].contents.colour.saturation = 1.0;
canvas[i][j].contents.colour.lightness = 0.0;
canvas[i][j].volume = (float)hue/2.5;
if (red == 0)
if (green == 0)
if ( blue == 0) {
canvas[i][j].contents.liquid_content = 0;
canvas[i][j].contents.drying_rate = 0;
canvas[i][j].contents.miscibility = 0;
canvas[i][j].contents.colour.hue = 0;
canvas[i][j].volume = 0;
}
if (red == 255)
if (green == 255)
if ( blue == 255) {
canvas[i][j].contents.liquid_content = 0;
canvas[i][j].contents.drying_rate = 0;
canvas[i][j].contents.miscibility = 0;
canvas[i][j].contents.colour.hue = 360;
canvas[i][j].volume = 0;
}
}
if (( i %10) == 0){
fprintf(stderr,".");
fflush(stderr);
}
}
printf(" done\n");
pm_close( ifp );
/*exit(0);*/
}