Removed brush mode from mosaic.c due to high cpu load and changed the fullscreen mode so it no longer uses switchin()

This commit is contained in:
Andrew Corcoran 2008-08-03 22:42:34 +00:00
parent a0cd6daeb5
commit 14f38f95e2

View file

@ -45,15 +45,14 @@
#define gettext_noop(String) String
#endif
static void mosaic_noise_pixel(void * ptr, SDL_Surface * canvas, int noise_AMOUNT, int x, int y);
static void mosaic_blur_pixel(void * ptr, SDL_Surface * canvas, SDL_Surface * last, int x, int y);
static void mosaic_sharpen_pixel(void * ptr, SDL_Surface * canvas, SDL_Surface * last, int x, int y);
static const int mosaic_AMOUNT= 300;
static const int mosaic_RADIUS = 16;
static const double mosaic_SHARPEN = 1.0;
//Holder for the pre calulated pixel values
static SDL_Surface * mosaic_temp;
static SDL_Surface * mosaic_final;
enum {
TOOL_MOSAIC,
mosaic_NUM_TOOLS
@ -117,88 +116,69 @@ static int mosaic_grey(Uint8 r1,Uint8 g1,Uint8 b1){
return 0.3*r1+.59*g1+0.11*b1;
}
//Do the effect for one pixel
static void mosaic_do_noise_pixel(magic_api * api, SDL_Surface * canvas, SDL_Surface * last, int x, int y){
}
//Do the effect for one pixel
static void do_mosaic_pixel(void * ptr, int which,
SDL_Surface * canvas, SDL_Surface * last,
int x, int y){
magic_api * api = (magic_api *) ptr;
Uint8 r1,g1,b1;
SDL_GetRGB(api->getpixel(mosaic_final, x, y), mosaic_final->format, &r1, &g1, &b1);
api->putpixel(canvas, x, y, SDL_MapRGB(canvas->format, r1, g1, b1));
}
// Do the effect for the full image
static void do_mosaic_full(void * ptr, SDL_Surface * canvas, SDL_Surface * last, int which){
magic_api * api = (magic_api *) ptr;
Uint32 amask = ~(canvas->format->Rmask |
canvas->format->Gmask |
canvas->format->Bmask);
SDL_Surface * mosaic_temp =
SDL_CreateRGBSurface(SDL_SWSURFACE,
canvas->w,
canvas->h,
canvas->format->BitsPerPixel,
canvas->format->Rmask,
canvas->format->Gmask,
canvas->format->Bmask, amask);
int x,y;
api->update_progress_bar();
for (y = 0; y < canvas->h; y++){
for (x=0; x < canvas->w; x++){
do_mosaic_pixel(ptr, which, canvas, last, x, y);
mosaic_noise_pixel(api, canvas, mosaic_AMOUNT, x, y);
}
}
}
//do the effect for the brush
static void do_mosaic_brush(void * ptr, int which, SDL_Surface * canvas, SDL_Surface * last, int x, int y){
int xx, yy;
magic_api * api = (magic_api *) ptr;
api->update_progress_bar();
for (yy = y - mosaic_RADIUS; yy < y + mosaic_RADIUS; yy++)
{
for (xx = x - mosaic_RADIUS; xx < x + mosaic_RADIUS; xx++)
{
if (api->in_circle(xx - x, yy - y, mosaic_RADIUS) &&
!api->touched(xx, yy))
{
do_mosaic_pixel(api, which, canvas, last, xx, yy);
for (y = 0; y < canvas->h; y++){
for (x=0; x < canvas->w; x++){
mosaic_blur_pixel(api, mosaic_temp, canvas, x, y);
}
}
api->update_progress_bar();
for (y = 0; y < canvas->h; y++){
for (x=0; x < canvas->w; x++){
mosaic_sharpen_pixel(api, canvas, mosaic_temp, x, y);
}
}
SDL_FreeSurface(mosaic_temp);
}
// Affect the canvas on drag:
void mosaic_drag(magic_api * api, int which, SDL_Surface * canvas,
SDL_Surface * last, int ox, int oy, int x, int y,
SDL_Rect * update_rect){
api->line((void *) api, which, canvas, last, ox, oy, x, y, 1, do_mosaic_brush);
api->playsound(mosaic_snd_effect[which], (x * 255) / canvas->w, 255);
if (ox > x) { int tmp = ox; ox = x; x = tmp; }
if (oy > y) { int tmp = oy; oy = y; y = tmp; }
update_rect->x = ox - mosaic_RADIUS;
update_rect->y = oy - mosaic_RADIUS;
update_rect->w = (x + mosaic_RADIUS) - update_rect->x;
update_rect->h = (y + mosaic_RADIUS) - update_rect->y;
//no-op
}
// Affect the canvas on click:
void mosaic_click(magic_api * api, int which, int mode,
SDL_Surface * canvas, SDL_Surface * last,
int x, int y, SDL_Rect * update_rect){
if (mode == MODE_PAINT){
mosaic_drag(api, which, canvas, last, x, y, x, y, update_rect);
}
else{
update_rect->x = 0;
update_rect->y = 0;
update_rect->w = canvas->w;
update_rect->h = canvas->h;
do_mosaic_full(api, canvas, last, which);
api->playsound(mosaic_snd_effect[which], 128, 255);
}
}
// Affect the canvas on release:
@ -323,70 +303,15 @@ static void mosaic_sharpen_pixel(void * ptr,
void mosaic_switchin(magic_api * api, int which, int mode, SDL_Surface * canvas)
{
//Create two temp surfaces to store the calculated pixel values
Uint32 amask = ~(canvas->format->Rmask |
canvas->format->Gmask |
canvas->format->Bmask);
mosaic_temp =
SDL_CreateRGBSurface(SDL_SWSURFACE,
canvas->w,
canvas->h,
canvas->format->BitsPerPixel,
canvas->format->Rmask,
canvas->format->Gmask,
canvas->format->Bmask, amask);
mosaic_final =
SDL_CreateRGBSurface(SDL_SWSURFACE,
canvas->w,
canvas->h,
canvas->format->BitsPerPixel,
canvas->format->Rmask,
canvas->format->Gmask,
canvas->format->Bmask, amask);
//Copy the canvas to the temp surface
SDL_BlitSurface(canvas, NULL, mosaic_final, NULL);
int x,y;
//Add noise to the temp surface
for (y = 0; y < canvas->h; y++){
for (x=0; x < canvas->w; x++){
mosaic_noise_pixel(api, mosaic_final, mosaic_AMOUNT, x, y);
}
}
api->update_progress_bar();
//Blur the temp surface
for (y = 0; y < canvas->h; y++){
for (x=0; x < canvas->w; x++){
//We dont want pixels to be affected by already blurred nearby pixels so we require two surfaces
mosaic_blur_pixel(api, mosaic_temp, mosaic_final, x, y);
}
}
api->update_progress_bar();
//Sharpen the temp surface
for (y = 0; y < canvas->h; y++){
for (x=0; x < canvas->w; x++){
//We dont want pixels to be affected by already sharpened pixels so we require two surfaces
mosaic_sharpen_pixel(api, mosaic_final, mosaic_temp, x, y);
}
}
}
void mosaic_switchout(magic_api * api, int which, int mode, SDL_Surface * canvas)
{
SDL_FreeSurface(mosaic_temp);
SDL_FreeSurface(mosaic_final);
}
int mosaic_modes(magic_api * api, int which)
{
return(MODE_FULLSCREEN|MODE_PAINT);
return(MODE_FULLSCREEN);
}