diff --git a/examples/Makefile.am b/examples/Makefile.am index 6da32a0..61e06f3 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -2,7 +2,7 @@ AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/pipi -bin_PROGRAMS = edd img2rubik sharpen floodfill line bezier histogram +bin_PROGRAMS = edd img2rubik sharpen floodfill line bezier histogram colorstring edd_SOURCES = edd.c edd_LDADD = ../pipi/libpipi.la @@ -24,3 +24,6 @@ bezier_LDADD = ../pipi/libpipi.la histogram_SOURCES = histogram.c histogram_LDADD = ../pipi/libpipi.la + +colorstring_SOURCES = colorstring.c +colorstring_LDADD = ../pipi/libpipi.la diff --git a/examples/colorstring.c b/examples/colorstring.c new file mode 100644 index 0000000..ecde729 --- /dev/null +++ b/examples/colorstring.c @@ -0,0 +1,20 @@ +#include +#include + +int main(int argc, char *argv[]) +{ + if(argc!=2) + { + fprintf(stderr, "Need one argument (only)\n"); + return -1; + } + + pipi_pixel_t *color = pipi_get_color_from_string(argv[1]); + printf("Color : %f %f %f %f\n", + color->pixel_float.r, + color->pixel_float.g, + color->pixel_float.b, + color->pixel_float.a); + + return 0; +} diff --git a/pipi/Makefile.am b/pipi/Makefile.am index bf1c08f..aa77553 100644 --- a/pipi/Makefile.am +++ b/pipi/Makefile.am @@ -21,6 +21,7 @@ libpipi_la_SOURCES = \ pixels.c \ codec.c \ stock.c \ + colorstring.c \ resize.c \ dither.c \ measure.c \ diff --git a/pipi/colorstring.c b/pipi/colorstring.c new file mode 100644 index 0000000..a821f28 --- /dev/null +++ b/pipi/colorstring.c @@ -0,0 +1,151 @@ +/* + * libpipi Proper image processing implementation library + * Copyright (c) 2004-2008 Sam Hocevar + * 2008 Jean-Yves Lamoureux + * 2008 Jean-Yves Lamoureux +#include +#include +#include +#include + +#include "pipi.h" +#include "pipi_internals.h" + + +struct color_table +{ + char name[255]; + float a,r,g,b; +}; + +struct color_table color_table[] = +{ + {.name = "black" , 1, 0, 0, 0}, + {.name = "white" , 1, 1, 1, 1}, + {.name = "red" , 1, 1, 0, 0}, + {.name = "green" , 1, 0, 1, 0}, + {.name = "blue" , 1, 0, 0, 1}, + {.name = "yellow" , 1, 1, 1, 0}, + {.name = "cyan" , 1, 0, 1, 1}, + {.name = "magenta", 1, 1, 0, 1}, + {.name = "grey" , 1, 0.5, 0.5, 0.5}, + {.name = "gray" , 1, 0.5, 0.5, 0.5}, + {.name = "grey50" , 1, 0.5, 0.5, 0.5}, + {.name = "gray50" , 1, 0.5, 0.5, 0.5}, + {.name = "grey25" , 1, 0.25, 0.25, 0.25}, + {.name = "gray25" , 1, 0.25, 0.25, 0.25}, +}; + + + +pipi_pixel_t *pipi_get_color_from_string(const char* s) +{ + if(!s) return NULL; + + + pipi_pixel_t *color = malloc(sizeof(pipi_pixel_t)); + + + if(s[0] == '#') + { + uint32_t c = 0; + sscanf(s, "%x", &c); + + color->pixel_float.a = ((c&0xFF000000)>>24) / 255.0f; + color->pixel_float.r = ((c&0x00FF0000)>>16) / 255.0f; + color->pixel_float.g = ((c&0x0000FF00)>>8) / 255.0f; + color->pixel_float.b = ((c&0x000000FF)>>0) / 255.0f; + } + else if(!strncmp(s, "rgb(", 4)) + { + uint32_t r ,g ,b; + sscanf(s, "rgb(%u,%u,%u)", &r, &g, &b); + color->pixel_float.r = r / 255.0f; + color->pixel_float.g = g / 255.0f; + color->pixel_float.b = b / 255.0f; + } + else if(!strncmp(s, "frgb(", 5)) + { + float r ,g ,b; + sscanf(s, "frgb(%f,%f,%f)", &r, &g, &b); + color->pixel_float.r = r; + color->pixel_float.g = g; + color->pixel_float.b = b; + } + else if(!strncmp(s, "argb(", 4)) + { + uint32_t a, r ,g ,b; + sscanf(s, "argb(%u,%u,%u,%u)", &a, &r, &g, &b); + color->pixel_float.a = a / 255.0f; + color->pixel_float.r = r / 255.0f; + color->pixel_float.g = g / 255.0f; + color->pixel_float.b = b / 255.0f; + } + else if(!strncmp(s, "fargb(", 5)) + { + float a, r ,g ,b; + sscanf(s, "fargb(%f, %f,%f,%f)", &a, &r, &g, &b); + color->pixel_float.a = a; + color->pixel_float.r = r; + color->pixel_float.g = g; + color->pixel_float.b = b; + } + else + { + unsigned int i; + for(i=0; ipixel_float.a = color_table[i].a; + color->pixel_float.r = color_table[i].r; + color->pixel_float.g = color_table[i].g; + color->pixel_float.b = color_table[i].b; + break; + } + } + + + } + return color; +} diff --git a/pipi/paint/line.c b/pipi/paint/line.c index 0f2542d..0e84120 100644 --- a/pipi/paint/line.c +++ b/pipi/paint/line.c @@ -73,6 +73,7 @@ int pipi_draw_line(pipi_image_t *img , int x1, int y1, int x2, int y2, uint32_t s.x2 = x2; s.y2 = y2; + /* No Transparency routine for u32 yet, fallback to float version */ if(img->last_modified == PIPI_PIXELS_RGBA_C) { diff --git a/pipi/pipi.h b/pipi/pipi.h index c5e04fc..c781c36 100644 --- a/pipi/pipi.h +++ b/pipi/pipi.h @@ -1,6 +1,7 @@ /* * libpipi Proper image processing implementation library * Copyright (c) 2004-2008 Sam Hocevar + * 2008 Jean-Yves Lamoureux #include +#include #ifdef __cplusplus extern "C" @@ -78,8 +80,8 @@ typedef struct { union { - struct pixel_u32 pixel_u32; struct pixel_float pixel_float; + struct pixel_u32 pixel_u32; }; } pipi_pixel_t; @@ -102,6 +104,9 @@ typedef struct pipi_context pipi_context_t; /* pipi_histogram_t: the histogram type */ typedef struct pipi_histogram pipi_histogram_t; +extern pipi_pixel_t *pipi_get_color_from_string(const char* s); + + extern pipi_context_t *pipi_create_context(void); extern void pipi_destroy_context(pipi_context_t *); extern int pipi_command(pipi_context_t *, char const *, ...);