rnd-20030121-2-src
[rocksndiamonds.git] / src / screens.c
index e99697810143aa152f42d5f42e9cb3e771450e14..554e53a83085c574caf39be020e4425ca8aa56d5 100644 (file)
@@ -71,6 +71,11 @@ static void HandleChooseTree(int, int, int, int, int, TreeInfo **);
 static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS];
 static int setup_mode = SETUP_MODE_MAIN;
 
+#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
+static Bitmap *scrollbar_bitmap[4];
+#endif
+
+
 static void drawCursorExt(int xpos, int ypos, int color, int graphic)
 {
   static int cursor_array[SCR_FIELDY];
@@ -130,7 +135,7 @@ static void ToggleFullscreenIfNeeded()
     setup.fullscreen = video.fullscreen_enabled;
 
     /* redraw background to newly created backbuffer */
-    BlitBitmap(new_graphic_info[IMG_MENU_FRAME].bitmap, backbuffer,
+    BlitBitmap(graphic_info[IMG_GLOBAL_BORDER].bitmap, backbuffer,
               0,0, WIN_XSIZE,WIN_YSIZE, 0,0);
 
     /* restore old door content */
@@ -149,10 +154,13 @@ void DrawMainMenu()
 
   UnmapAllGadgets();
   FadeSounds();
+
   KeyboardAutoRepeatOn();
   ActivateJoystick();
+
   SetDrawDeactivationMask(REDRAW_NONE);
-  SetBackgroundBitmap(new_graphic_info[IMG_MENU_BACKGROUND].bitmap);
+  SetDrawBackgroundMask(REDRAW_FIELD);
+
   audio.sound_deactivated = FALSE;
 
   /* needed if last screen was the playing screen, invoked from level editor */
@@ -193,10 +201,11 @@ void DrawMainMenu()
   GetPlayerConfig();
   LoadLevel(level_nr);
 
-  SetBackgroundBitmap(new_graphic_info[IMG_MENU_BACKGROUND].bitmap);
+  SetMainBackgroundImage(IMG_BACKGROUND_MAIN);
   ClearWindow();
 
   DrawHeadline();
+
   DrawText(SX + 32,    SY + 2*32, name_text, FS_BIG, FC_GREEN);
   DrawText(SX + 6*32,  SY + 2*32, setup.player_name, FS_BIG, FC_RED);
   DrawText(SX + 32,    SY + 3*32, "Level:", FS_BIG, FC_GREEN);
@@ -566,12 +575,12 @@ static int OLD_helpscreen_action[] =
 
 static int helpscreen_action[] =
 {
-  IMG_PLAYER1_DOWN_MOVING,             16,
-  IMG_PLAYER1_UP_MOVING,               16,
-  IMG_PLAYER1_LEFT_MOVING,             16,
-  IMG_PLAYER1_RIGHT_MOVING,            16,
-  IMG_PLAYER1_LEFT_PUSHING,            16,
-  IMG_PLAYER1_RIGHT_PUSHING,           16,                     HA_NEXT,
+  IMG_PLAYER1_MOVING_DOWN,             16,
+  IMG_PLAYER1_MOVING_UP,               16,
+  IMG_PLAYER1_MOVING_LEFT,             16,
+  IMG_PLAYER1_MOVING_RIGHT,            16,
+  IMG_PLAYER1_PUSHING_LEFT,            16,
+  IMG_PLAYER1_PUSHING_RIGHT,           16,                     HA_NEXT,
 
   IMG_SAND,                            -1,                     HA_NEXT,
 
@@ -704,25 +713,25 @@ static int helpscreen_action[] =
 
   IMG_ROBOT,                           -1,                     HA_NEXT,
 
-  IMG_MOLE_RIGHT_MOVING,               16,
-  IMG_MOLE_UP_MOVING,                  16,
-  IMG_MOLE_LEFT_MOVING,                        16,
-  IMG_MOLE_DOWN_MOVING,                        16,                     HA_NEXT,
+  IMG_MOLE_MOVING_RIGHT,               16,
+  IMG_MOLE_MOVING_UP,                  16,
+  IMG_MOLE_MOVING_LEFT,                        16,
+  IMG_MOLE_MOVING_DOWN,                        16,                     HA_NEXT,
 
-  IMG_PENGUIN_RIGHT_MOVING,            16,
-  IMG_PENGUIN_UP_MOVING,               16,
-  IMG_PENGUIN_LEFT_MOVING,             16,
-  IMG_PENGUIN_DOWN_MOVING,             16,                     HA_NEXT,
+  IMG_PENGUIN_MOVING_RIGHT,            16,
+  IMG_PENGUIN_MOVING_UP,               16,
+  IMG_PENGUIN_MOVING_LEFT,             16,
+  IMG_PENGUIN_MOVING_DOWN,             16,                     HA_NEXT,
 
-  IMG_PIG_RIGHT_MOVING,                        16,
-  IMG_PIG_UP_MOVING,                   16,
-  IMG_PIG_LEFT_MOVING,                 16,
-  IMG_PIG_DOWN_MOVING,                 16,                     HA_NEXT,
+  IMG_PIG_MOVING_RIGHT,                        16,
+  IMG_PIG_MOVING_UP,                   16,
+  IMG_PIG_MOVING_LEFT,                 16,
+  IMG_PIG_MOVING_DOWN,                 16,                     HA_NEXT,
 
-  IMG_DRAGON_RIGHT_MOVING,             16,
-  IMG_DRAGON_UP_MOVING,                        16,
-  IMG_DRAGON_LEFT_MOVING,              16,
-  IMG_DRAGON_DOWN_MOVING,              16,                     HA_NEXT,
+  IMG_DRAGON_MOVING_RIGHT,             16,
+  IMG_DRAGON_MOVING_UP,                        16,
+  IMG_DRAGON_MOVING_LEFT,              16,
+  IMG_DRAGON_MOVING_DOWN,              16,                     HA_NEXT,
 
   IMG_SATELLITE,                       -1,                     HA_NEXT,
 
@@ -999,6 +1008,7 @@ void DrawHelpScreenElText(int start)
   int xstart = SX + 56, ystart = SY + 65 + 2 * 32, ystep = TILEY + 4;
   int ybottom = SYSIZE - 20;
 
+  SetMainBackgroundImage(IMG_BACKGROUND_INFO);
   ClearWindow();
   DrawHeadline();
 
@@ -1122,6 +1132,7 @@ void DrawHelpScreen()
     helpscreen_step[i] = helpscreen_frame[i] = 0;
   helpscreen_musicpos = 0;
   helpscreen_state = 0;
+
   DrawHelpScreenElText(0);
   DrawHelpScreenElAction(0);
 
@@ -1253,6 +1264,7 @@ static void DrawChooseTree(TreeInfo **ti_ptr)
   CloseDoor(DOOR_CLOSE_2);
 
   ClearWindow();
+
   HandleChooseTree(0,0, 0,0, MB_MENU_INITIALIZE, ti_ptr);
   MapChooseTreeGadgets(*ti_ptr);
 
@@ -1567,6 +1579,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
 
 void DrawChooseLevel()
 {
+  SetMainBackgroundImage(IMG_BACKGROUND_LEVEL_SERIES);
+
   DrawChooseTree(&leveldir_current);
 }
 
@@ -1594,7 +1608,9 @@ static void drawHallOfFameList(int first_entry, int highlight_position)
 {
   int i;
 
+  SetMainBackgroundImage(IMG_BACKGROUND_HALL_OF_FAME);
   ClearWindow();
+
   DrawText(SX + 80, SY + 8, "Hall Of Fame", FS_BIG, FC_YELLOW);
   DrawTextFCentered(46, FC_RED, "HighScores of Level %d", level_nr);
 
@@ -1999,6 +2015,7 @@ static void DrawSetupScreen_Generic()
 
   UnmapAllGadgets();
   CloseDoor(DOOR_CLOSE_2);
+
   ClearWindow();
 
   if (setup_mode == SETUP_MODE_MAIN)
@@ -2175,6 +2192,7 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button)
 void DrawSetupScreen_Input()
 {
   ClearWindow();
+
   DrawText(SX+16, SY+16, "Setup Input", FS_BIG, FC_YELLOW);
 
   initCursor(0, IMG_BALL_BLUE);
@@ -2744,6 +2762,8 @@ void DrawSetupScreen()
 {
   DeactivateJoystick();
 
+  SetMainBackgroundImage(IMG_BACKGROUND_SETUP);
+
   if (setup_mode == SETUP_MODE_INPUT)
     DrawSetupScreen_Input();
   else if (setup_mode == SETUP_MODE_CHOOSE_GRAPHICS)
@@ -2827,7 +2847,11 @@ static struct
 
 static struct
 {
+#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
+  Bitmap **gfx_unpressed, **gfx_pressed;
+#else
   int gfx_unpressed, gfx_pressed;
+#endif
   int x, y;
   int width, height;
   int type;
@@ -2836,7 +2860,11 @@ static struct
 } scrollbar_info[NUM_SCREEN_SCROLLBARS] =
 {
   {
+#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
+    &scrollbar_bitmap[0], &scrollbar_bitmap[1],
+#else
     IMG_SCROLLBAR_BLUE, IMG_SCROLLBAR_RED,
+#endif
     SX + SC_SCROLL_VERTICAL_XPOS, SY + SC_SCROLL_VERTICAL_YPOS,
     SC_SCROLL_VERTICAL_XSIZE, SC_SCROLL_VERTICAL_YSIZE,
     GD_TYPE_SCROLLBAR_VERTICAL,
@@ -2871,12 +2899,12 @@ static void CreateScreenScrollbuttons()
 
     gfx_unpressed = scrollbutton_info[i].gfx_unpressed;
     gfx_pressed   = scrollbutton_info[i].gfx_pressed;
-    gd_bitmap_unpressed = new_graphic_info[gfx_unpressed].bitmap;
-    gd_bitmap_pressed   = new_graphic_info[gfx_pressed].bitmap;
-    gd_x1 = new_graphic_info[gfx_unpressed].src_x;
-    gd_y1 = new_graphic_info[gfx_unpressed].src_y;
-    gd_x2 = new_graphic_info[gfx_pressed].src_x;
-    gd_y2 = new_graphic_info[gfx_pressed].src_y;
+    gd_bitmap_unpressed = graphic_info[gfx_unpressed].bitmap;
+    gd_bitmap_pressed   = graphic_info[gfx_pressed].bitmap;
+    gd_x1 = graphic_info[gfx_unpressed].src_x;
+    gd_y1 = graphic_info[gfx_unpressed].src_y;
+    gd_x2 = graphic_info[gfx_pressed].src_x;
+    gd_y2 = graphic_info[gfx_pressed].src_y;
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_CUSTOM_TYPE_ID, i,
@@ -2907,7 +2935,9 @@ static void CreateScreenScrollbars()
   for (i=0; i<NUM_SCREEN_SCROLLBARS; i++)
   {
     Bitmap *gd_bitmap_unpressed, *gd_bitmap_pressed;
+#if !defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
     int gfx_unpressed, gfx_pressed;
+#endif
     int gd_x1, gd_x2, gd_y1, gd_y2;
     struct GadgetInfo *gi;
     int items_max, items_visible, item_position;
@@ -2921,14 +2951,23 @@ static void CreateScreenScrollbars()
 
     event_mask = GD_EVENT_MOVING | GD_EVENT_OFF_BORDERS;
 
+#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
+    gd_bitmap_unpressed = *scrollbar_info[i].gfx_unpressed;
+    gd_bitmap_pressed   = *scrollbar_info[i].gfx_pressed;
+    gd_x1 = 0;
+    gd_y1 = 0;
+    gd_x2 = 0;
+    gd_y2 = 0;
+#else
     gfx_unpressed = scrollbar_info[i].gfx_unpressed;
     gfx_pressed   = scrollbar_info[i].gfx_pressed;
-    gd_bitmap_unpressed = new_graphic_info[gfx_unpressed].bitmap;
-    gd_bitmap_pressed   = new_graphic_info[gfx_pressed].bitmap;
-    gd_x1 = new_graphic_info[gfx_unpressed].src_x;
-    gd_y1 = new_graphic_info[gfx_unpressed].src_y;
-    gd_x2 = new_graphic_info[gfx_pressed].src_x;
-    gd_y2 = new_graphic_info[gfx_pressed].src_y;
+    gd_bitmap_unpressed = graphic_info[gfx_unpressed].bitmap;
+    gd_bitmap_pressed   = graphic_info[gfx_pressed].bitmap;
+    gd_x1 = graphic_info[gfx_unpressed].src_x;
+    gd_y1 = graphic_info[gfx_unpressed].src_y;
+    gd_x2 = graphic_info[gfx_pressed].src_x;
+    gd_y2 = graphic_info[gfx_pressed].src_y;
+#endif
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_CUSTOM_TYPE_ID, i,
@@ -2958,6 +2997,27 @@ static void CreateScreenScrollbars()
 
 void CreateScreenGadgets()
 {
+#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
+  int i;
+
+  for (i=0; i<4; i++)
+  {
+    scrollbar_bitmap[i] = CreateBitmap(TILEX, TILEY, DEFAULT_DEPTH);
+
+    /* copy pointers to clip mask and GC */
+    scrollbar_bitmap[i]->clip_mask =
+      graphic_info[IMG_SCROLLBAR_BLUE + i].clip_mask;
+    scrollbar_bitmap[i]->stored_clip_gc =
+      graphic_info[IMG_SCROLLBAR_BLUE + i].clip_gc;
+
+    BlitBitmap(graphic_info[IMG_SCROLLBAR_BLUE + i].bitmap,
+              scrollbar_bitmap[i],
+              graphic_info[IMG_SCROLLBAR_BLUE + i].src_x,
+              graphic_info[IMG_SCROLLBAR_BLUE + i].src_y,
+              TILEX, TILEY, 0, 0);
+  }
+#endif
+
   CreateScreenScrollbuttons();
   CreateScreenScrollbars();
 }
@@ -2966,6 +3026,17 @@ void FreeScreenGadgets()
 {
   int i;
 
+#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
+  for (i=0; i<4; i++)
+  {
+    /* prevent freeing clip mask and GC twice */
+    scrollbar_bitmap[i]->clip_mask = None;
+    scrollbar_bitmap[i]->stored_clip_gc = None;
+
+    FreeBitmap(scrollbar_bitmap[i]);
+  }
+#endif
+
   for (i=0; i<NUM_SCREEN_GADGETS; i++)
     FreeGadget(screen_gadget[i]);
 }