/* * libee ASCII-Art library * Copyright (c) 2002, 2003 Sam Hocevar * All Rights Reserved * * $Id$ * * This program 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. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #ifdef HAVE_INTTYPES_H # include #else typedef unsigned char uint8_t; #endif #include #include "ee.h" #include "ee_internals.h" #include void ee_blit(int x1, int y1, int x2, int y2, void *pixels, int w, int h) { char foo[] = { ' ', '.', ':', ';', '=', '$', '%', '@', '#', '8', 'W' }; int x, y, pitch; if(x1 > x2) { int tmp = x2; x2 = x1; x1 = tmp; } if(y1 > y2) { int tmp = y2; y2 = y1; y1 = tmp; } pitch = (3 * w + 3) / 4 * 4; for(y = y1 > 0 ? y1 : 0; y <= y2 && y <= ee_get_height(); y++) for(x = x1 > 0 ? x1 : 0; x <= x2 && x <= ee_get_width(); x++) { int fromx = w * (x - x1) / (x2 - x1 + 1); int fromy = h * (y - y1) / (y2 - y1 + 1); int r = ((unsigned char *)pixels)[3 * fromx + pitch * fromy]; int g = ((unsigned char *)pixels)[3 * fromx + 1 + pitch * fromy]; int b = ((unsigned char *)pixels)[3 * fromx + 2 + pitch * fromy]; if(r == g && g == b) { ee_set_color(EE_LIGHTGRAY); } else { static int foo_colors[6] = {EE_LIGHTRED, EE_YELLOW, EE_LIGHTGREEN, EE_LIGHTCYAN, EE_LIGHTBLUE, EE_LIGHTMAGENTA}; float min = r, max = r, delta, hue, sat; if(min > g) min = g; if(max < g) max = g; if(min > b) min = b; if(max < b) max = b; delta = max - min; sat = max / delta; if(delta > 20) { if( r == max ) hue = (g - b) / delta; // between yellow & magenta else if( g == max ) hue = 2 + (b - r) / delta; // between cyan & yellow else hue = 4 + (r - g) / delta; // between magenta & cyan hue *= 60; // degrees if( hue < 0 ) hue += 360; ee_set_color(foo_colors[(int)(hue + 30) / 60]); } else { ee_set_color(EE_LIGHTGRAY); } } ee_putchar(x, y, foo[(r + g + b) / 3 / 25]); } }