source: tuxpaint/trunk/fuentes/magic/src/alien.c @ 219

Last change on this file since 219 was 219, checked in by mabarracus, 4 years ago

added sources from trusty

File size: 8.4 KB
Line 
1/*
2  alien.c
3//
4  alien, Modifies the colours of the image.
5  Tux Paint - A simple drawing program for children.
6
7  Credits: Andrew Corcoran <akanewbie@gmail.com> inspired by the Alien Map GIMP plugin
8
9  Copyright (c) 2002-2007 by Bill Kendrick and others; see AUTHORS.txt
10  bill@newbreedsoftware.com
11  http://www.tuxpaint.org/
12
13  This program is free software; you can redistribute it and/or modify
14  it under the terms of the GNU General Public License as published by
15  the Free Software Foundation; either version 2 of the License, or
16  (at your option) any later version.
17
18  This program is distributed in the hope that it will be useful,
19  but WITHOUT ANY WARRANTY; without even the implied warranty of
20  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  GNU General Public License for more details.
22
23  You should have received a copy of the GNU General Public License
24  along with this program; if not, write to the Free Software
25  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26  (See COPYING.txt)
27
28  Last updated: June 6, 2008
29  $Id: alien.c,v 1.10 2014/03/19 23:39:17 wkendrick Exp $
30*/
31
32#include <stdio.h>
33#include <string.h>
34#include <libintl.h>
35#include "tp_magic_api.h"
36#include "SDL_image.h"
37#include "SDL_mixer.h"
38#include <math.h>
39#include <limits.h>
40#include <time.h>
41
42#ifndef gettext_noop
43#define gettext_noop(String) String
44#endif
45
46static const double alien_ANGLE[] = {0,0,0};
47static const double alien_FREQUENCY[] = {1,1,1};
48static const int alien_RADIUS = 16;
49
50enum {
51        TOOL_alien,
52        alien_NUM_TOOLS
53};
54
55static Mix_Chunk * alien_snd_effect[alien_NUM_TOOLS];
56
57const char * alien_snd_filenames[alien_NUM_TOOLS] = {
58  "alien.ogg",
59};
60const char * alien_icon_filenames[alien_NUM_TOOLS] = {
61  "alien.png",
62};
63const char * alien_names[alien_NUM_TOOLS] = {
64  gettext_noop("Color Shift"),
65};
66const char * alien_descs[alien_NUM_TOOLS][2] = {
67  {gettext_noop("Click and move the mouse to change the colors in parts of your picture."),
68    gettext_noop("Click to change the colors in your entire picture."),},
69};
70
71// Prototypes
72Uint32 alien_api_version(void);
73int alien_init(magic_api * api);
74int alien_get_tool_count(magic_api * api);
75SDL_Surface * alien_get_icon(magic_api * api, int which);
76char * alien_get_name(magic_api * api, int which);
77char * alien_get_description(magic_api * api, int which, int mode);
78void alien_drag(magic_api * api, int which, SDL_Surface * canvas,
79                  SDL_Surface * last, int ox, int oy, int x, int y,
80                  SDL_Rect * update_rect);
81Mix_Chunk * magic_loadsound(char* file);
82void alien_click(magic_api * api, int which, int mode,
83                   SDL_Surface * canvas, SDL_Surface * last,
84                   int x, int y, SDL_Rect * update_rect);
85void alien_release(magic_api * api, int which,
86                   SDL_Surface * canvas, SDL_Surface * last,
87                   int x, int y, SDL_Rect * update_rect);
88void alien_shutdown(magic_api * api);
89void alien_set_color(magic_api * api, Uint8 r, Uint8 g, Uint8 b);
90int alien_requires_colors(magic_api * api, int which);
91void alien_switchin(magic_api * api, int which, int mode, SDL_Surface * canvas);
92void alien_switchout(magic_api * api, int which, int mode, SDL_Surface * canvas);
93int alien_modes(magic_api * api, int which);
94
95
96Uint32 alien_api_version(void) { return(TP_MAGIC_API_VERSION); }
97
98//Load sounds
99int alien_init(magic_api * api){
100  int i;
101  char fname[1024];
102
103  srand(time(0));
104
105  for (i = 0; i < alien_NUM_TOOLS; i++){
106    snprintf(fname, sizeof(fname), "%s/sounds/magic/%s", api->data_directory, alien_snd_filenames[i]);
107    alien_snd_effect[i] = Mix_LoadWAV(fname);
108  }
109  return(1);
110}
111
112int alien_get_tool_count(magic_api * api ATTRIBUTE_UNUSED){
113  return(alien_NUM_TOOLS);
114}
115
116// Load our icons:
117SDL_Surface * alien_get_icon(magic_api * api, int which){
118  char fname[1024];
119  snprintf(fname, sizeof(fname), "%simages/magic/%s", api->data_directory, alien_icon_filenames[which]);
120  return(IMG_Load(fname));
121}
122
123// Return our names, localized:
124char * alien_get_name(magic_api * api ATTRIBUTE_UNUSED, int which){
125    return(strdup(gettext_noop(alien_names[which])));
126}
127
128// Return our descriptions, localized:
129char * alien_get_description(magic_api * api ATTRIBUTE_UNUSED, int which, int mode){
130  return(strdup(gettext_noop(alien_descs[which][mode-1])));
131}
132
133//Do the effect for one pixel
134static void do_alien_pixel(void * ptr, int which ATTRIBUTE_UNUSED,
135                 SDL_Surface * canvas, SDL_Surface * last ATTRIBUTE_UNUSED,
136                 int x, int y){
137        magic_api * api = (magic_api *) ptr;
138
139  Uint8 temp[3];
140  double temp2[3];
141  int k;
142
143        SDL_GetRGB(api->getpixel(canvas,x, y), canvas->format, &temp[0], &temp[1], &temp[2]);
144  for (k =0;k<3;k++){
145//EP      temp2[k] = clamp(0,127.5 * (1.0 + sin (((temp[k] / 127.5 - 1.0) * alien_FREQUENCY[k] + alien_ANGLE[k] / 180.0) * M_PI)),255);
146          temp2[k] = clamp(0.0,
147                                           127.5 * (
148                                                                1.0 + sin (((temp[k] / 127.5 - 1.0) * alien_FREQUENCY[k] + alien_ANGLE[k] / 180.0) * M_PI)
149                                                                ),
150                                           255.0);
151  }
152        api->putpixel(canvas, x, y, SDL_MapRGB(canvas->format, temp2[0], temp2[1], temp2[2]));
153
154}
155
156// Do the effect for the full image
157static void do_alien_full(void * ptr,SDL_Surface * canvas, SDL_Surface * last, int which){
158
159        magic_api * api = (magic_api *) ptr;
160
161        int x,y;
162
163        for (y = 0; y < last->h; y++){
164                for (x=0; x < last->w; x++){
165      do_alien_pixel(ptr, which, canvas, last, x, y);
166          }
167  }
168}
169
170//do the effect for the brush
171static void do_alien_brush(void * ptr, int which, SDL_Surface * canvas, SDL_Surface * last, int x, int y){
172  int xx, yy;
173  magic_api * api = (magic_api *) ptr;
174
175  for (yy = y - alien_RADIUS; yy < y + alien_RADIUS; yy++)
176  {
177    for (xx = x - alien_RADIUS; xx < x + alien_RADIUS; xx++)
178    {
179      if (api->in_circle(xx - x, yy - y, alien_RADIUS) &&
180          !api->touched(xx, yy))
181      {
182        do_alien_pixel(api, which, canvas, last, xx, yy);
183      }
184    }
185  }
186}
187
188// Affect the canvas on drag:
189void alien_drag(magic_api * api, int which, SDL_Surface * canvas,
190                  SDL_Surface * last, int ox, int oy, int x, int y,
191                  SDL_Rect * update_rect){
192   
193  api->line((void *) api, which, canvas, last, ox, oy, x, y, 1, do_alien_brush);
194
195  api->playsound(alien_snd_effect[which], (x * 255) / canvas->w, 255);
196
197  if (ox > x) { int tmp = ox; ox = x; x = tmp; }
198  if (oy > y) { int tmp = oy; oy = y; y = tmp; }
199
200  update_rect->x = ox - alien_RADIUS;
201  update_rect->y = oy - alien_RADIUS;
202  update_rect->w = (x + alien_RADIUS) - update_rect->x;
203  update_rect->h = (y + alien_RADIUS) - update_rect->y;
204}
205
206int use_sound = 1;
207
208Mix_Chunk * magic_loadsound(char* file){
209  Mix_Chunk * temp;
210
211  if (!use_sound){
212    return (Mix_Chunk*)-1;
213  }
214  temp = Mix_LoadWAV(file);
215  return temp;
216}
217
218// Affect the canvas on click:
219void alien_click(magic_api * api, int which, int mode,
220                   SDL_Surface * canvas, SDL_Surface * last,
221                   int x, int y, SDL_Rect * update_rect){
222  if (mode == MODE_PAINT)
223    alien_drag(api, which, canvas, last, x, y, x, y, update_rect);
224  else{
225    update_rect->x = 0;
226    update_rect->y = 0;
227    update_rect->w = canvas->w;
228    update_rect->h = canvas->h;
229    do_alien_full(api, canvas,  last, which);
230    api->playsound(alien_snd_effect[which], 128, 255);
231  }
232}
233
234// Affect the canvas on release:
235void alien_release(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED,
236                   SDL_Surface * canvas ATTRIBUTE_UNUSED, SDL_Surface * last ATTRIBUTE_UNUSED,
237                   int x ATTRIBUTE_UNUSED, int y ATTRIBUTE_UNUSED, SDL_Rect * update_rect ATTRIBUTE_UNUSED)
238{
239}
240
241// No setup happened:
242void alien_shutdown(magic_api * api ATTRIBUTE_UNUSED)
243{
244        //Clean up sounds
245        int i;
246        for(i=0; i<alien_NUM_TOOLS; i++){
247                if(alien_snd_effect[i] != NULL){
248                        Mix_FreeChunk(alien_snd_effect[i]);
249                }
250        }
251}
252
253// Record the color from Tux Paint:
254void alien_set_color(magic_api * api ATTRIBUTE_UNUSED, Uint8 r ATTRIBUTE_UNUSED, Uint8 g ATTRIBUTE_UNUSED, Uint8 b ATTRIBUTE_UNUSED)
255{
256}
257
258// Use colors:
259int alien_requires_colors(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED)
260{
261  return 0;
262}
263
264void alien_switchin(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED, SDL_Surface * canvas ATTRIBUTE_UNUSED)
265{
266}
267
268void alien_switchout(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED, SDL_Surface * canvas ATTRIBUTE_UNUSED)
269{
270}
271
272int alien_modes(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED)
273{
274  return(MODE_FULLSCREEN|MODE_PAINT);
275}
276
Note: See TracBrowser for help on using the repository browser.