4 Sherman's aquarium - Screensaver part
6 Updated and partly rewritten for Sherman's aquarium v3.0.0 on
7 30th and 31st December 2003.
9 Jonas Aaberg <cja@gmx.net>
21 #include <gdk-pixbuf/gdk-pixbuf.h>
29 #if SDL_BYTEORDER == SDL_BIG_ENDIAN
30 #define RMASK 0xff000000
31 #define GMASK 0x00ff0000
32 #define BMASK 0x0000ff00
33 #define AMASK 0x000000ff
37 #define RMASK 0x000000ff
38 #define GMASK 0x0000ff00
39 #define BMASK 0x00ff0000
40 #define AMASK 0xff000000
47 unsigned char r,g,b,alpha;
54 #include "background.h"
57 #include "soundeffects.h"
64 #include <dbus/dbus.h>
65 #include <dbus/dbus-glib.h>
74 #define ARG_SEAFLOOR 1
77 #define ARG_PLANTSCALE 4
78 #define ARG_BOTTOMANIMALS 5
80 #define ARG_BG_SOLID 7
81 #define ARG_BG_SHADED 8
82 #define ARG_BG_WATERALIKE 9
83 #define ARG_BG_IMAGE 10
90 #define ARG_BG_IMAGE_FILE 17
92 #define ARG_SELECTED 19
93 #define ARG_RANDOM_POP 20
100 #define ARG_BLOWFISH 27
101 #define ARG_SWORDFISH 28
102 #define ARG_BDWELLER 29
103 #define ARG_FILLMORE 30
104 #define ARG_SHERMAN 31
106 #define ARG_HUNTER 33
109 #define ARG_ERNEST 36
111 #define ARG_HAWTHORNE 38
113 #define ARG_EXPLODE 40
114 #define ARG_REBIRTH 41
115 #define ARG_SCALEDIFF 42
118 #define ARG_HUNTERA 45
119 #define ARG_SWORDA 46
120 #define ARG_SOUNDPRG 47
121 #define ARG_WINDOW_ID 48
122 #define ARG_FULLSCREEN 49
123 #define ARG_BUBBLE 50
124 #define ARG_DESKTOP 51
125 #define ARG_COMICS 52
126 #define ARG_COMICS_DIR 53
127 #define ARG_COMICS_DELAY 54
132 static int screen_width;
133 static int screen_height;
134 static gboolean comics = FALSE;
135 static char *comic_dirs[1024]; /* No more than 1024 comic dirs :-) Ugly, but... */
136 static int num_comic_dirs = 0;
138 static GdkWindow *window;
140 static SDL_Surface *screen=NULL, *screen_image, *background, **thisfish;
141 static SDL_Rect *fish_dest, *fish_src, *clean_dest;
142 static int curr_dest, clean_count, no_sdl_quit = 0, comics_delay = 50;
143 int window_id = -1, fullscreen = 1;
145 static unsigned char *original_bg;
146 static AquariumData ad;
149 static osso_context_t *osso;
150 DBusConnection *dbus_conn_session;
151 static int pause_in_view = 0;
153 void screensaver_draw_image(int x, int y, int idx, int rev, SA_Image *image)
156 fish_dest[curr_dest].x=x;
157 fish_dest[curr_dest].y=y;
158 fish_dest[curr_dest].w=image->width;
159 fish_dest[curr_dest].h=image->height;
161 fish_src[curr_dest].x=0;
162 fish_src[curr_dest].y=(int)((float)idx*(float)image->full_height/(float)image->frames+0.5);
163 fish_src[curr_dest].w=image->width;
164 fish_src[curr_dest].h=image->height;
167 thisfish[curr_dest] = SDL_CreateRGBSurfaceFrom(image->image,
169 (int)((float)image->full_height*(float)(idx+1) /
170 (float)image->frames + 0.5),
172 RMASK, GMASK, BMASK, AMASK);
174 thisfish[curr_dest] = SDL_CreateRGBSurfaceFrom(image->rev,
176 (int)((float)image->full_height*(float)(idx+1) /
177 (float)image->frames + 0.5),
179 RMASK, GMASK, BMASK, AMASK);
187 void screensaver_clean(int x,int y,int w,int h)
190 clean_dest[clean_count].x=x-5;
191 clean_dest[clean_count].y=y-5;
192 clean_dest[clean_count].w=w+10;
193 clean_dest[clean_count].h=h+10;
196 SDL_BlitSurface(background,&clean_dest[clean_count],screen,&clean_dest[clean_count]);
202 void screensaver_quit()
204 /* Resetting the term signal to the orignal so we can quit nicely.*/
205 signal(SIGTERM, SIG_DFL);
208 kill(getpid(),SIGTERM);
212 /* In case something is really weird */
213 kill(getpid(),SIGKILL);
216 void comics_clean(void)
219 for(i=0;i<num_comic_dirs;i++)
220 g_free(comic_dirs[i]);
222 comic_dirs[0] = NULL;
225 void comics_prepare(char *dir)
227 comic_dirs[num_comic_dirs] = g_strdup_printf("%s/*", dir);
230 /* Make sure the final one is always followed by a NULL */
231 comic_dirs[num_comic_dirs] = NULL;
234 char *comics_pick(void)
236 int i, flags = GLOB_NOSORT;
238 char *the_comic = NULL;
241 for(i=0;i<num_comic_dirs;i++){
243 flags |= GLOB_APPEND;
244 glob(comic_dirs[i], flags, NULL, &comic_files);
247 if(comic_files.gl_pathc != 0)
248 the_comic = g_strdup(comic_files.gl_pathv[g_rand_int_range(ad.rnd, 0, comic_files.gl_pathc)]);
250 globfree(&comic_files);
258 void comics_load(void)
260 int i,j, srs, ys, xs, alpha, sy, dy;
262 char *comic_file = NULL;
263 GError *ferror = NULL;
264 GdkPixbuf *comic_pic, *tmp_pic;
266 memcpy(ad.rgb, original_bg, ad.xmax*3*ad.ymax);
267 memcpy(ad.bgr, original_bg, ad.xmax*3*ad.ymax);
269 comic_file = comics_pick();
271 if(comic_file == NULL)
274 comic_pic = gdk_pixbuf_new_from_file(comic_file, &ferror);
278 if(comic_pic == NULL)
281 if(screen_height < gdk_pixbuf_get_height(comic_pic) || screen_width < gdk_pixbuf_get_width(comic_pic)){
283 tmp_pic = gdk_pixbuf_scale_simple(comic_pic,screen_width, screen_height, GDK_INTERP_BILINEAR);
284 g_object_unref(comic_pic);
289 ys = (screen_height - gdk_pixbuf_get_height(comic_pic))/2;
290 xs = (screen_width - gdk_pixbuf_get_width(comic_pic))/2;
293 srs = gdk_pixbuf_get_rowstride(comic_pic);
294 alpha = gdk_pixbuf_get_has_alpha(comic_pic);
295 src = gdk_pixbuf_get_pixels(comic_pic);
297 for(i=0;i<gdk_pixbuf_get_height(comic_pic);i++){
299 dy = (i+ys) * ad.xmax + xs;
301 for(j=0;j<gdk_pixbuf_get_width(comic_pic);j++){
302 ad.bgr[(dy+j)*3+0] = ad.rgb[(dy+j)*3+0] = src[sy + j*(3+alpha)+0];
303 ad.bgr[(dy+j)*3+1] = ad.rgb[(dy+j)*3+1] = src[sy + j*(3+alpha)+1];
304 ad.bgr[(dy+j)*3+2] = ad.rgb[(dy+j)*3+2] = src[sy + j*(3+alpha)+2];
307 g_object_unref(comic_pic);
313 void screensaver_main_sdl(void)
317 #ifdef PERFORMACE_CHECK
320 clock_t cali1, cali2;
330 totaltime1 = clock();
336 if(counter == 0 && comics){
338 SDL_BlitSurface(screen_image, NULL, screen, NULL);
339 SDL_UpdateRect(screen,0,0,0,0);
340 counter = 25*comics_delay;
351 for(i=0;i<curr_dest;i++)
352 SDL_BlitSurface(thisfish[i],&fish_src[i],screen,&fish_dest[i]);
355 /* If we get a SIGTERM from screensaver in this loop, and we later do a SDL_Quit()
356 X will get problems. So we have to avoid calling SDL_Quit if a sigterm is caught
360 Xlib: unexpected async reply (sequence 0xf03)!
361 And sherman's starts eating processor power like mad!
364 for(i=0;i<curr_dest;i++){
365 SDL_UpdateRects(screen,1,&clean_dest[i]);
366 SDL_FreeSurface(thisfish[i]);
379 /* Check if we're going too fast! */
380 if((float)(cali2-cali1) < (float)(0.2*CLOCKS_PER_SEC)){
381 delay=(int)(((float)((0.2*CLOCKS_PER_SEC)-(cali2-cali1))/CLOCKS_PER_SEC)*100000);
385 if(delay<((int)(((float)((0.2*CLOCKS_PER_SEC)-(cali2-cali1))/CLOCKS_PER_SEC)*100000))){
386 delay-=(int)(((float)((0.2*CLOCKS_PER_SEC)-(cali2-cali1))/CLOCKS_PER_SEC)*100000);
398 while(SDL_PollEvent(&event)){
408 case SDL_MOUSEMOTION:
413 case SDL_MOUSEBUTTONDOWN:
422 #ifdef PERFORMACE_CHECK
424 printf("Frames: %d\n",totalframes);
425 printf("Seconds: %f\n",(float)(totaltime2-totaltime1)/CLOCKS_PER_SEC);
426 printf("FPS: %f\n",(float)totalframes/((float)(totaltime2-totaltime1)/CLOCKS_PER_SEC));
431 void screensaver_main_gdk(void)
438 while(gdk_events_pending()){
439 event = gdk_event_get();
441 if(event->type == GDK_DESTROY)
446 if(counter == 0 && comics){
448 counter = 25*comics_delay;
452 memcpy(ad.rgb, ad.bgr, ad.ymax * ad.xmax * 3);
455 gdk_draw_rgb_image(window, gc, ad.xmin, ad.ymin, ad.xmax, ad.ymax,
456 GDK_RGB_DITHER_NONE, ad.rgb, ad.xmax * 3);
462 if (pause_in_view == 0)
463 /* non blocking read of the next available message */
464 dbus_connection_read_write(dbus_conn_session, 0);
466 /* blocking read of the next available message */
467 dbus_connection_read_write(dbus_conn_session, 20000);
469 msg = dbus_connection_pop_message(dbus_conn_session);
474 if ( dbus_message_get_member (msg) &&
475 !strncmp( "play_livebg_on_view", dbus_message_get_member (msg),19)){
478 if ( dbus_message_get_member (msg) &&
479 !strncmp( "pause_livebg_on_view", dbus_message_get_member (msg),19)){
487 void init_sdl(int sdl_flags)
490 if (SDL_Init(SDL_INIT_VIDEO) < 0){
491 printf("Can't init SDL: %s\n",SDL_GetError());
496 signal(SIGTERM, screensaver_quit);
500 if(!SDL_VideoModeOK(screen_width,screen_height, DEPTH, sdl_flags)){
501 printf("Sorry, video mode %dx%d in %d bits isn't supported by hardware\n",
502 screen_width,screen_height, DEPTH);
507 screen = SDL_SetVideoMode(screen_width, screen_height, DEPTH, sdl_flags);
510 printf("Unable to set video mode %dx%d in %d bits.\n",
511 screen_width,screen_height,DEPTH);
515 SDL_WM_SetCaption("Sherman's aquarium",NULL);
518 /* Hide the mouse cursor */
521 /* Start with all black */
522 SDL_FillRect(screen,NULL,0x000000);
524 screen_image = SDL_CreateRGBSurfaceFrom(ad.rgb, ad.xmax, ad.ymax, DEPTH, ad.xmax*3,
525 RMASK, GMASK, BMASK, 0);
526 background = SDL_CreateRGBSurfaceFrom(ad.bgr, ad.xmax, ad.ymax, DEPTH, ad.xmax*3,
527 RMASK, GMASK, BMASK, 0);
530 SDL_BlitSurface(screen_image, NULL, screen, NULL);
531 SDL_UpdateRect(screen,0,0,0,0);
535 initialize_dbus(void){
536 gchar *filter_string;
539 dbus_error_init (&error);
540 /* Add D-BUS signal handler for 'status_changed' */
541 dbus_conn_session = (DBusConnection *) osso_get_dbus_connection(osso);
542 if (dbus_conn_session){
544 g_strdup_printf("interface='org.maemo.livewp', member='pause_livebg_on_view%i'", view);
545 dbus_bus_add_match(dbus_conn_session, filter_string, &error);
546 if (dbus_error_is_set(&error)){
547 fprintf(stderr,"dbus_bus_add_match failed: %s", error.message);
548 dbus_error_free(&error);
550 g_free(filter_string);
552 g_strdup_printf("interface='org.maemo.livewp', member='play_livebg_on_view%i'", view);
553 dbus_bus_add_match(dbus_conn_session, filter_string, &error);
554 if (dbus_error_is_set(&error)){
555 fprintf(stderr,"dbus_bus_add_match failed: %s", error.message);
556 dbus_error_free(&error);
558 g_free(filter_string);
563 void screensaver_init()
566 XWindowAttributes win_attr;
568 Fish_settings *fish_settings;
569 Bubble_settings *bubble_settings;
570 int sdl_flags = SDL_DOUBLEBUF|SDL_HWSURFACE|SDL_ANYFORMAT;
575 osso = osso_initialize("org.maemo.sherman", "3.0", TRUE, NULL);
579 display = XOpenDisplay(NULL);
580 XGetWindowAttributes(display, (Window)window_id, &win_attr);
581 screen_height = win_attr.height;
582 screen_width = win_attr.width;
584 ad.proximity = 1; /* No sound effects */
585 window = gdk_window_foreign_new((Window)window_id);
586 gdk_window_show(window);
587 gc = gdk_gc_new(window);
591 screen_width = gdk_screen_width();
592 screen_height = gdk_screen_height();
594 display=XOpenDisplay(NULL);
595 sdl_command = g_strdup_printf("SDL_WINDOWID=%d",
596 (int)RootWindowOfScreen(ScreenOfDisplay(display, DefaultScreen(display))));
599 sdl_flags |= SDL_FULLSCREEN;
602 ad.xmax = screen_width;
603 ad.ymax = screen_height;
605 ad.virtual_aquarium_x = ad.xmax + 2 * VIRTUAL_AQUARIUM_DX;
606 ad.virtual_aquarium_y = ad.ymax + 2 * VIRTUAL_AQUARIUM_DY;
608 ad.ymin = ad.xmin = ad.viewpoint_start_x = ad.viewpoint_start_y = 0;
610 ad.rgb = g_malloc0(ad.xmax*3*ad.ymax);
611 ad.bgr = g_malloc0(ad.xmax*3*ad.ymax);
612 original_bg = g_malloc0(ad.xmax*3*ad.ymax);
620 memcpy(ad.rgb, ad.bgr, ad.xmax*3*ad.ymax);
621 memcpy(original_bg, ad.bgr, ad.xmax*3*ad.ymax);
624 if(fullscreen || window_id == -1)
628 fish_settings = fish_get_settings_ptr();
629 bubble_settings = bubble_get_settings_ptr();
631 fish_dest = g_malloc0(sizeof(SDL_Rect)*(fish_settings->num_fish +
632 bubble_settings->max_bubbles));
633 fish_src = g_malloc0(sizeof(SDL_Rect)*(fish_settings->num_fish +
634 bubble_settings->max_bubbles));
635 clean_dest = g_malloc0(sizeof(SDL_Rect)*(fish_settings->num_fish +
636 bubble_settings->max_bubbles));
638 thisfish = g_malloc0(sizeof(SDL_Surface*)*(fish_settings->num_fish + bubble_settings->max_bubbles));
646 if(str[0]!='0' || str[1]!='x') return -1;
647 for(i=2;i<strlen(str);i++){
649 if(str[i]>='0' && str[i]<='9') d=(int)(str[i]-'0');
650 if(str[i]>='A' && str[i]<='F') d=(int)(str[i]-'A'+10);
651 if(str[i]>='a' && str[i]<='f') d=(int)(str[i]-'a'+10);
660 void screensaver_init_param(int argc, char **argv)
662 int i,c, numfish = 0, comic_start;
665 Sound_settings *s, sound_settings = {0,TYPE_MP3, NULL};
666 Bubble_settings *bub, bubble_settings = {20};
667 Bottom_settings *b, bottom_settings = {1,5,1,75,3};
668 Background_settings *bg, background_settings = {NULL,NULL, 2,0,
669 (GaiColor){0, 100, 150, 0},
670 (GaiColor){10,120, 250, 0},
671 (GaiColor){0,0,0,0}};
672 Fish_settings *f, fish_settings = {1, 1, 75, 0, 100, 1, 15, 0, 75, 75,
673 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
674 struct option cmdline_options[] = {
675 {"sound", no_argument, NULL, ARG_SOUND},
676 {"soundprg", required_argument, NULL, ARG_SOUNDPRG},
677 {"ogg", no_argument, NULL, ARG_OGG},
680 {"seafloor", no_argument, NULL, ARG_SEAFLOOR},
681 {"plants", required_argument, NULL, ARG_PLANTS},
682 {"plantscale", required_argument, NULL, ARG_PLANTSCALE},
683 {"bottomanimals", required_argument, NULL, ARG_BOTTOMANIMALS},
685 {"bg_solid", no_argument, NULL, ARG_BG_SOLID},
686 {"bg_shaded", no_argument, NULL, ARG_BG_SHADED},
687 {"bg_wateralike", no_argument, NULL, ARG_BG_WATERALIKE},
688 {"bg_image", no_argument, NULL, ARG_BG_IMAGE},
691 {"lcr", required_argument, NULL, ARG_LCR},
692 {"lcg", required_argument, NULL, ARG_LCG},
693 {"lcb", required_argument, NULL, ARG_LCB},
695 {"ucr", required_argument, NULL, ARG_UCR},
696 {"ucg", required_argument, NULL, ARG_UCG},
697 {"ucb", required_argument, NULL, ARG_UCB},
699 {"bg_image_file", required_argument, NULL, ARG_BG_IMAGE_FILE},
701 {"comics", no_argument, NULL, ARG_COMICS},
702 {"comics_dir", required_argument, NULL, ARG_COMICS_DIR},
703 {"comics_delay", required_argument, NULL, ARG_COMICS_DELAY},
706 {"random", no_argument, NULL, ARG_RANDOM},
707 {"selected", no_argument, NULL, ARG_SELECTED},
708 {"random_pop", required_argument, NULL, ARG_RANDOM_POP},
710 {"fish1", required_argument, NULL, ARG_FISH1},
711 {"fish2", required_argument, NULL, ARG_FISH2},
712 {"fish3", required_argument, NULL, ARG_FISH3},
713 {"fish4", required_argument, NULL, ARG_FISH4},
714 {"fish5", required_argument, NULL, ARG_FISH5},
715 {"fish6", required_argument, NULL, ARG_FISH6},
716 {"swordfish", required_argument, NULL, ARG_SWORDFISH},
717 {"blowfish", required_argument, NULL, ARG_BLOWFISH},
718 {"bdweller", required_argument, NULL, ARG_BDWELLER},
719 {"fillmore", required_argument, NULL, ARG_FILLMORE},
720 {"sherman", required_argument, NULL, ARG_SHERMAN},
721 {"megan", required_argument, NULL, ARG_MEGAN},
722 {"hunter", required_argument, NULL, ARG_HUNTER},
723 {"prey", required_argument, NULL, ARG_PREY},
724 {"lori", required_argument, NULL, ARG_LORI},
725 {"ernest", required_argument, NULL, ARG_ERNEST},
726 {"squid", required_argument, NULL, ARG_SQUID},
727 {"hawthorne", required_argument, NULL, ARG_HAWTHORNE},
729 {"eat", no_argument, NULL, ARG_EAT},
730 {"explode", no_argument, NULL, ARG_EXPLODE},
731 {"rebirth", no_argument, NULL, ARG_REBIRTH},
732 {"scalediff", no_argument, NULL, ARG_SCALEDIFF},
733 {"speed", required_argument, NULL, ARG_SPEED},
734 {"scale", required_argument, NULL, ARG_SCALE},
735 {"huntera", required_argument, NULL, ARG_HUNTERA},
736 {"sworda", required_argument, NULL, ARG_SWORDA},
737 {"window-id", required_argument, NULL, ARG_WINDOW_ID},
738 {"root", no_argument, NULL, ARG_FULLSCREEN},
739 {"bubble", required_argument, NULL, ARG_BUBBLE},
740 {"desktop", no_argument, NULL, ARG_DESKTOP},
741 {"view", required_argument, NULL, ARG_VIEW},
745 b = bottom_get_settings_ptr();
746 bub = bubble_get_settings_ptr();
747 bg = background_get_settings_ptr();
748 f = fish_get_settings_ptr();
749 s = sound_get_settings_ptr();
751 memcpy(f,&fish_settings, sizeof(Fish_settings));
752 memcpy(bg,&background_settings, sizeof(Background_settings));
753 memcpy(b,&bottom_settings, sizeof(Bottom_settings));
754 memcpy(bub, &bubble_settings, sizeof(Bubble_settings));
755 memcpy(s, &sound_settings, sizeof(Sound_settings));
756 fprintf(stderr, "1BG %i\n",bg->desktop);
759 getopt_long_only(argc, argv, "", cmdline_options, NULL)) != -1){
764 b->have_sea_floor = 1;
770 b->max_plants = atoi(optarg);
773 b->scale = atoi(optarg);
775 case ARG_BOTTOMANIMALS:
776 b->num_bottom_animals = atoi(optarg);
786 bg->type = BG_SHADED;
789 case ARG_BG_WATERALIKE:
798 bg->solid_c.r = bg->shaded_bot_c.r = atoi(optarg);
801 bg->solid_c.g = bg->shaded_bot_c.g = atoi(optarg);
804 bg->solid_c.b = bg->shaded_bot_c.b = atoi(optarg);
807 bg->shaded_top_c.r = atoi(optarg);
810 bg->shaded_top_c.g = atoi(optarg);
813 bg->shaded_top_c.b = atoi(optarg);
815 case ARG_BG_IMAGE_FILE:
816 bg->imagename = g_strdup_printf(optarg);
819 f->type = RANDOM_FISH;
822 f->type = SELECTION_FISH;
825 f->num_fish = atoi(optarg);
828 f->fish1 = atoi(optarg);
831 f->fish2 = atoi(optarg);
834 f->fish3 = atoi(optarg);
837 f->fish4 = atoi(optarg);
840 f->fish5 = atoi(optarg);
843 f->fish6 = atoi(optarg);
846 f->blowfish = atoi(optarg);
849 f->swordfish = atoi(optarg);
852 f->bdweller = atoi(optarg);
855 f->fillmore = atoi(optarg);
858 f->sherman = atoi(optarg);
861 f->megan = atoi(optarg);
864 f->hunter = atoi(optarg);
867 f->prey = atoi(optarg);
870 f->lori = atoi(optarg);
873 f->ernest = atoi(optarg);
876 f->squid = atoi(optarg);
879 f->hawthorne = atoi(optarg);
894 f->speed = atoi(optarg);
897 f->scale = atoi(optarg);
899 f->hunter_agr = atoi(optarg);
902 f->swordfish_agr = atoi(optarg);
905 s->prg = g_strdup_printf(optarg);
908 window_id = atoi(optarg);
914 bub->max_bubbles = atoi(optarg);
925 comics_prepare(IMAGE_PATH "/strips");
927 case ARG_COMICS_DELAY:
928 comics_delay = atoi(optarg);
933 comic_buff = g_strdup(optarg);
934 for(i=0;i<strlen(optarg);i++){
935 if(comic_buff[i] == ';'){
936 comic_buff[i] = '\0';
937 comics_prepare(comic_buff+comic_start);
941 comics_prepare(comic_buff+comic_start);
956 numfish += f->swordfish;
957 numfish += f->blowfish;
958 numfish += f->fillmore;
959 numfish += f->sherman;
961 numfish += f->hunter;
963 numfish += f->ernest;
966 numfish += f->bdweller;
967 numfish += f->hawthorne;
969 if(f->type == SELECTION_FISH)
970 f->num_fish = numfish;
975 int main(int argc, char **argv)
977 gdk_init(&argc, &argv);
979 ad.rnd = g_rand_new();
981 screensaver_init_param(argc, argv);
985 fprintf(stderr, "screensaver_main_sdl\n");
986 screensaver_main_sdl();
989 fprintf(stderr, "screensaver_main_GDK\n");
990 screensaver_main_gdk();
996 AquariumData *aquarium_get_settings_ptr(void)
1001 unsigned char *aquarium_install_path(void)
1007 void aquarium_draw_image(int x, int y, int idx, int rev, SA_Image *image)
1010 screensaver_draw_image(x, y, idx, rev, image);
1012 draw_image(x, y, idx, rev, image);
1015 void aquarium_draw_pic_alpha(SA_Image *image, int w, int h, int x, int y, int idx, int alpha)
1018 screensaver_draw_image(x, y, idx, 0, image);
1020 draw_pic_alpha(image->image, w, h, x, y, idx,alpha);
1024 void aquarium_clean_image(int x, int y, int w, int h)
1027 screensaver_clean(x, y, w, h);
1030 GdkPixbuf *gai_load_image(char *fname)
1036 full_name = g_strdup_printf("%s/%s",IMAGE_PATH,fname);
1037 pix = gdk_pixbuf_new_from_file(full_name, &msg);
1039 printf("%s\n",msg->message);
1047 void gai_display_error_continue(char *msg)
1049 printf(" *** Error: %s\n",msg);