/* * EffecTV - Realtime Digital Video Effector * Copyright (C) 2001-2003 FUKUCHI Kentaro * * FireTV - clips incoming objects and burn them. * Copyright (C) 2001-2002 FUKUCHI Kentaro * * Fire routine is taken from Frank Jan Sorensen's demo program. */ #include #include #include "EffecTV.h" #include "utils.h" static int start(void); static int stop(void); static int draw(RGB32 *src, RGB32 *dest); static int event(SDL_Event *); #define MaxColor 120 #define Decay 15 #define MAGIC_THRESHOLD 50 static char *effectname = "FireTV"; static int state = 0; static unsigned char *buffer; static RGB32 palette[256]; static int mode = 0; static int bgIsSet; static int setBackground(RGB32 *src) { image_bgset_y(src); bgIsSet = 1; return 0; } static void makePalette() { int i, r, g, b; for(i=0; iname = effectname; entry->start = start; entry->stop = stop; entry->draw = draw; entry->event = event; makePalette(); return entry; } static int start() { image_set_threshold_y(MAGIC_THRESHOLD); memset(buffer, 0, video_area); bgIsSet = 0; state = 1; return 0; } static int stop() { state = 0; return 0; } static int draw(RGB32 *src, RGB32 *dest) { int i, x, y; unsigned char v; unsigned char *diff; if(!bgIsSet) { setBackground(src); } switch(mode) { case 0: default: diff = image_bgsubtract_y(src); for(i=0; i>16) & 0xff; if(v > 150) { buffer[i] |= v; } } break; case 2: for(i=0; itype == SDL_KEYDOWN) { switch(event->key.keysym.sym) { case SDLK_SPACE: if(mode == 0) { bgIsSet = 0; } break; case SDLK_1: case SDLK_KP1: mode = 0; break; case SDLK_2: case SDLK_KP2: mode = 1; break; case SDLK_3: case SDLK_KP3: mode = 2; break; default: break; } } return 0; }