X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=09e068a3be0235efdcbf4a8d65e7992a5eff14d6;hb=ee0895b12e544444db37febb1242bcc8a72d6ad8;hp=0532cdd19e2f054e9d42df7059653fe2c0f40faf;hpb=fa2a77aa4b53bb786e67f35d6c46f759ebe7823d;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 0532cdd1..09e068a3 100644 --- a/src/screens.c +++ b/src/screens.c @@ -27,16 +27,17 @@ /* screens in the setup menu */ #define SETUP_MODE_MAIN 0 #define SETUP_MODE_GAME 1 -#define SETUP_MODE_INPUT 2 -#define SETUP_MODE_SHORTCUT 3 -#define SETUP_MODE_GRAPHICS 4 -#define SETUP_MODE_SOUND 5 -#define SETUP_MODE_ARTWORK 6 -#define SETUP_MODE_CHOOSE_GRAPHICS 7 -#define SETUP_MODE_CHOOSE_SOUNDS 8 -#define SETUP_MODE_CHOOSE_MUSIC 9 - -#define MAX_SETUP_MODES 10 +#define SETUP_MODE_EDITOR 2 +#define SETUP_MODE_INPUT 3 +#define SETUP_MODE_SHORTCUT 4 +#define SETUP_MODE_GRAPHICS 5 +#define SETUP_MODE_SOUND 6 +#define SETUP_MODE_ARTWORK 7 +#define SETUP_MODE_CHOOSE_GRAPHICS 8 +#define SETUP_MODE_CHOOSE_SOUNDS 9 +#define SETUP_MODE_CHOOSE_MUSIC 10 + +#define MAX_SETUP_MODES 11 /* for input setup functions */ #define SETUPINPUT_SCREEN_POS_START 0 @@ -70,31 +71,47 @@ static void HandleChooseTree(int, int, int, int, int, TreeInfo **); static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS]; static int setup_mode = SETUP_MODE_MAIN; -static void drawCursorExt(int pos, int color, int graphic) +#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]; - if (graphic) - cursor_array[pos] = graphic; - - graphic = cursor_array[pos]; + if (xpos == 0) + { + if (graphic != 0) + cursor_array[ypos] = graphic; + else + graphic = cursor_array[ypos]; + } if (color == FC_RED) graphic = (graphic == IMG_ARROW_BLUE_LEFT ? IMG_ARROW_RED_LEFT : graphic == IMG_ARROW_BLUE_RIGHT ? IMG_ARROW_RED_RIGHT : IMG_BALL_RED); - DrawGraphic(0, MENU_SCREEN_START_YPOS + pos, graphic, 0); + ypos += MENU_SCREEN_START_YPOS; + + DrawBackground(SX + xpos * 32, SY + ypos * 32, TILEX, TILEY); + DrawGraphicThruMask(xpos, ypos, graphic, 0); } -static void initCursor(int pos, int graphic) +static void initCursor(int ypos, int graphic) { - drawCursorExt(pos, FC_BLUE, graphic); + drawCursorExt(0, ypos, FC_BLUE, graphic); } -static void drawCursor(int pos, int color) +static void drawCursor(int ypos, int color) { - drawCursorExt(pos, color, 0); + drawCursorExt(0, ypos, color, 0); +} + +static void drawCursorXY(int xpos, int ypos, int graphic) +{ + drawCursorExt(xpos, ypos, -1, graphic); } void DrawHeadline() @@ -118,7 +135,7 @@ static void ToggleFullscreenIfNeeded() setup.fullscreen = video.fullscreen_enabled; /* redraw background to newly created backbuffer */ - BlitBitmap(new_graphic_info[IMG_MENU_BACK].bitmap, backbuffer, + BlitBitmap(graphic_info[IMG_GLOBAL_BORDER].bitmap, backbuffer, 0,0, WIN_XSIZE,WIN_YSIZE, 0,0); /* restore old door content */ @@ -137,9 +154,13 @@ void DrawMainMenu() UnmapAllGadgets(); FadeSounds(); + KeyboardAutoRepeatOn(); ActivateJoystick(); + SetDrawDeactivationMask(REDRAW_NONE); + SetDrawBackgroundMask(REDRAW_FIELD); + audio.sound_deactivated = FALSE; /* needed if last screen was the playing screen, invoked from level editor */ @@ -180,8 +201,11 @@ void DrawMainMenu() GetPlayerConfig(); LoadLevel(level_nr); + 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); @@ -209,8 +233,13 @@ void DrawMainMenu() for(i=0; i<8; i++) initCursor(i, (i == 1 || i == 6 ? IMG_ARROW_BLUE_RIGHT : IMG_BALL_BLUE)); +#if 0 DrawGraphic(10, 3, IMG_ARROW_BLUE_LEFT, 0); DrawGraphic(14, 3, IMG_ARROW_BLUE_RIGHT, 0); +#else + drawCursorXY(10, 1, IMG_ARROW_BLUE_LEFT); + drawCursorXY(14, 1, IMG_ARROW_BLUE_RIGHT); +#endif DrawText(SX + 56, SY + 326, "A Game by Artsoft Entertainment", FS_SMALL, FC_RED); @@ -318,10 +347,8 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) level_nr = new_level_nr; - DrawTextExt(drawto, SX + 11 * 32, SY + 3 * 32, - int2str(level_nr, 3), FS_BIG, font_color); - DrawTextExt(window, SX + 11 * 32, SY + 3 * 32, - int2str(level_nr, 3), FS_BIG, font_color); + DrawText(SX + 11 * 32, SY + 3 * 32, int2str(level_nr, 3), + FS_BIG, font_color); LoadLevel(level_nr); DrawMicroLevel(MICROLEV_XPOS, MICROLEV_YPOS, TRUE); @@ -981,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(); @@ -1104,6 +1132,7 @@ void DrawHelpScreen() helpscreen_step[i] = helpscreen_frame[i] = 0; helpscreen_musicpos = 0; helpscreen_state = 0; + DrawHelpScreenElText(0); DrawHelpScreenElAction(0); @@ -1183,8 +1212,10 @@ void HandleTypeName(int newxpos, Key key) if (newxpos) { xpos = newxpos; - DrawText(SX + 6*32, SY + ypos*32, setup.player_name, FS_BIG, FC_YELLOW); - DrawGraphic(xpos + 6, ypos, IMG_BALL_RED, 0); + DrawText(SX + 6 * 32, SY + ypos * 32, setup.player_name, + FS_BIG, FC_YELLOW); + drawCursorXY(xpos + 6, ypos - 2, IMG_BALL_RED); + return; } @@ -1202,23 +1233,23 @@ void HandleTypeName(int newxpos, Key key) setup.player_name[xpos] = ascii; setup.player_name[xpos + 1] = 0; xpos++; - DrawTextExt(drawto, SX + 6*32, SY + ypos*32, - setup.player_name, FS_BIG, FC_YELLOW); - DrawTextExt(window, SX + 6*32, SY + ypos*32, - setup.player_name, FS_BIG, FC_YELLOW); - DrawGraphic(xpos + 6, ypos, IMG_BALL_RED, 0); + + DrawText(SX + 6 * 32, SY + ypos * 32, setup.player_name, + FS_BIG, FC_YELLOW); + drawCursorXY(xpos + 6, ypos - 2, IMG_BALL_RED); } else if ((key == KSYM_Delete || key == KSYM_BackSpace) && xpos > 0) { xpos--; setup.player_name[xpos] = 0; - DrawGraphic(xpos + 6, ypos, IMG_BALL_RED, 0); - DrawGraphic(xpos + 7, ypos, IMG_EMPTY, 0); + + DrawBackground(SX + (xpos + 6) * 32, SY + ypos * 32, 2 * TILEX, TILEY); + drawCursorXY(xpos + 6, ypos - 2, IMG_BALL_RED); } else if (key == KSYM_Return && xpos > 0) { - DrawText(SX + 6*32, SY + ypos*32, setup.player_name, FS_BIG, FC_RED); - DrawGraphic(xpos + 6, ypos, IMG_EMPTY, 0); + DrawText(SX + 6 * 32, SY + ypos * 32, setup.player_name, FS_BIG, FC_RED); + DrawBackground(SX + (xpos + 6) * 32, SY + ypos * 32, TILEX, TILEY); SaveSetup(); game_status = MAINMENU; @@ -1233,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); @@ -1266,7 +1298,7 @@ static void drawChooseTreeList(int first_entry, int num_page_entries, char *title_string = NULL; int offset = (ti->type == TREE_TYPE_LEVEL_DIR ? 0 : 16); - ClearRectangle(backbuffer, SX, SY, SXSIZE - 32, SYSIZE); + DrawBackground(SX, SY, SXSIZE - 32, SYSIZE); redraw_mask |= REDRAW_FIELD; title_string = @@ -1301,10 +1333,20 @@ static void drawChooseTreeList(int first_entry, int num_page_entries, } if (first_entry > 0) - DrawGraphic(0, 1, IMG_ARROW_BLUE_UP, 0); + { + int ypos = 1; + + DrawBackground(SX, SY + ypos * 32, TILEX, TILEY); + DrawGraphicThruMask(0, ypos, IMG_ARROW_BLUE_UP, 0); + } if (first_entry + num_page_entries < num_entries) - DrawGraphic(0, MAX_MENU_ENTRIES_ON_SCREEN + 1, IMG_ARROW_BLUE_DOWN, 0); + { + int ypos = MAX_MENU_ENTRIES_ON_SCREEN + 1; + + DrawBackground(SX, SY + ypos * 32, TILEX, TILEY); + DrawGraphicThruMask(0, ypos, IMG_ARROW_BLUE_DOWN, 0); + } } static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti) @@ -1318,7 +1360,7 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti) node_first = getTreeInfoFirstGroupEntry(ti); node = getTreeInfoFromPos(node_first, entry_pos); - ClearRectangle(drawto, SX + 32, SY + 32, SXSIZE - 64, 32); + DrawBackground(SX + 32, SY + 32, SXSIZE - 64, 32); if (node->parent_link) DrawTextFCentered(40, FC_RED, "leave group \"%s\"", node->class_desc); @@ -1537,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); } @@ -1564,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); @@ -1670,6 +1716,12 @@ static void execSetupGame() DrawSetupScreen(); } +static void execSetupEditor() +{ + setup_mode = SETUP_MODE_EDITOR; + DrawSetupScreen(); +} + static void execSetupGraphics() { setup_mode = SETUP_MODE_GRAPHICS; @@ -1745,6 +1797,7 @@ static void execSaveAndExitSetup() static struct TokenInfo setup_info_main[] = { { TYPE_ENTER_MENU, execSetupGame, "Game Settings" }, + { TYPE_ENTER_MENU, execSetupEditor, "Editor Settings" }, { TYPE_ENTER_MENU, execSetupGraphics, "Graphics" }, { TYPE_ENTER_MENU, execSetupSound, "Sound & Music" }, { TYPE_ENTER_MENU, execSetupArtwork, "Custom Artwork" }, @@ -1752,7 +1805,7 @@ static struct TokenInfo setup_info_main[] = { TYPE_ENTER_MENU, execSetupShortcut, "Key Shortcuts" }, { TYPE_EMPTY, NULL, "" }, { TYPE_LEAVE_MENU, execExitSetup, "Exit" }, - { TYPE_LEAVE_MENU, execSaveAndExitSetup, "Save and exit" }, + { TYPE_LEAVE_MENU, execSaveAndExitSetup, "Save and Exit" }, { 0, NULL, NULL } }; @@ -1763,7 +1816,24 @@ static struct TokenInfo setup_info_game[] = { TYPE_SWITCH, &setup.time_limit, "Timelimit:" }, { TYPE_SWITCH, &setup.autorecord, "Auto-Record:" }, { TYPE_EMPTY, NULL, "" }, - { TYPE_LEAVE_MENU, execSetupMain, "Exit" }, + { TYPE_LEAVE_MENU, execSetupMain, "Back" }, + { 0, NULL, NULL } +}; + +static struct TokenInfo setup_info_editor[] = +{ + { TYPE_STRING, NULL, "Offer Special Elements:"}, + { TYPE_SWITCH, &setup.editor.el_boulderdash, "BoulderDash:" }, + { TYPE_SWITCH, &setup.editor.el_emerald_mine, "Emerald Mine:" }, + { TYPE_SWITCH, &setup.editor.el_more, "More:" }, + { TYPE_SWITCH, &setup.editor.el_sokoban, "Sokoban:" }, + { TYPE_SWITCH, &setup.editor.el_supaplex, "Supaplex:" }, + { TYPE_SWITCH, &setup.editor.el_diamond_caves, "Diamd. Caves:" }, + { TYPE_SWITCH, &setup.editor.el_dx_boulderdash,"DX Boulderd.:" }, + { TYPE_SWITCH, &setup.editor.el_chars, "Characters:" }, + { TYPE_SWITCH, &setup.editor.el_custom, "Custom:" }, + { TYPE_EMPTY, NULL, "" }, + { TYPE_LEAVE_MENU, execSetupMain, "Back" }, { 0, NULL, NULL } }; @@ -1779,7 +1849,7 @@ static struct TokenInfo setup_info_graphics[] = { TYPE_SWITCH, &setup.quick_doors, "Quick Doors:" }, { TYPE_SWITCH, &setup.toons, "Toons:" }, { TYPE_EMPTY, NULL, "" }, - { TYPE_LEAVE_MENU, execSetupMain, "Exit" }, + { TYPE_LEAVE_MENU, execSetupMain, "Back" }, { 0, NULL, NULL } }; @@ -1791,7 +1861,7 @@ static struct TokenInfo setup_info_sound[] = { TYPE_SWITCH, &setup.sound_loops, "Sound Loops:" }, { TYPE_SWITCH, &setup.sound_music, "Game Music:" }, { TYPE_EMPTY, NULL, "" }, - { TYPE_LEAVE_MENU, execSetupMain, "Exit" }, + { TYPE_LEAVE_MENU, execSetupMain, "Back" }, { 0, NULL, NULL } }; @@ -1809,7 +1879,7 @@ static struct TokenInfo setup_info_artwork[] = { TYPE_YES_NO, &setup.override_level_sounds, "Sounds:" }, { TYPE_YES_NO, &setup.override_level_music, "Music:" }, { TYPE_EMPTY, NULL, "" }, - { TYPE_LEAVE_MENU, execSetupMain, "Exit" }, + { TYPE_LEAVE_MENU, execSetupMain, "Back" }, { 0, NULL, NULL } }; @@ -1824,7 +1894,7 @@ static struct TokenInfo setup_info_shortcut[] = { TYPE_EMPTY, NULL, "" }, { TYPE_YES_NO, &setup.ask_on_escape, "Ask on Esc:" }, { TYPE_EMPTY, NULL, "" }, - { TYPE_LEAVE_MENU, execSetupMain, "Exit" }, + { TYPE_LEAVE_MENU, execSetupMain, "Back" }, { 0, NULL, NULL } }; @@ -1945,6 +2015,7 @@ static void DrawSetupScreen_Generic() UnmapAllGadgets(); CloseDoor(DOOR_CLOSE_2); + ClearWindow(); if (setup_mode == SETUP_MODE_MAIN) @@ -1957,6 +2028,11 @@ static void DrawSetupScreen_Generic() setup_info = setup_info_game; title_string = "Setup Game"; } + else if (setup_mode == SETUP_MODE_EDITOR) + { + setup_info = setup_info_editor; + title_string = "Setup Editor"; + } else if (setup_mode == SETUP_MODE_GRAPHICS) { setup_info = setup_info_graphics; @@ -2020,12 +2096,18 @@ static void DrawSetupScreen_Generic() void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button) { static int choice_store[MAX_SETUP_MODES]; - int choice = choice_store[setup_mode]; + int choice = choice_store[setup_mode]; /* always starts with 0 */ int x = 0; int y = choice; if (button == MB_MENU_INITIALIZE) { + /* advance to first valid menu entry */ + while (choice < num_setup_info && + (setup_info[choice].type & TYPE_SKIP_ENTRY)) + choice++; + choice_store[setup_mode] = choice; + drawCursor(choice, FC_RED); return; } @@ -2110,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); @@ -2117,12 +2200,12 @@ void DrawSetupScreen_Input() initCursor(2, IMG_ARROW_BLUE_RIGHT); initCursor(13, IMG_ARROW_BLUE_LEFT); - DrawGraphic(10, MENU_SCREEN_START_YPOS, IMG_ARROW_BLUE_LEFT, 0); - DrawGraphic(12, MENU_SCREEN_START_YPOS, IMG_ARROW_BLUE_RIGHT, 0); + drawCursorXY(10, 0, IMG_ARROW_BLUE_LEFT); + drawCursorXY(12, 0, IMG_ARROW_BLUE_RIGHT); DrawText(SX+32, SY+2*32, "Player:", FS_BIG, FC_GREEN); DrawText(SX+32, SY+3*32, "Device:", FS_BIG, FC_GREEN); - DrawText(SX+32, SY+15*32, "Exit", FS_BIG, FC_GREEN); + DrawText(SX+32, SY+15*32, "Back", FS_BIG, FC_GREEN); #if 0 DeactivateJoystickForCalibration(); @@ -2184,7 +2267,7 @@ static void drawPlayerSetupInputInfo(int player_nr) custom_key = setup.input[player_nr].key; DrawText(SX+11*32, SY+2*32, int2str(player_nr + 1, 1), FS_BIG, FC_RED); - DrawGraphic(8, 2, PLAYER_NR_GFX(IMG_PLAYER1, player_nr), 0); + DrawGraphicThruMask(8, 2, PLAYER_NR_GFX(IMG_PLAYER1, player_nr), 0); if (setup.input[player_nr].use_joystick) { @@ -2202,10 +2285,10 @@ static void drawPlayerSetupInputInfo(int player_nr) } DrawText(SX+32, SY+5*32, "Actual Settings:", FS_BIG, FC_GREEN); - DrawGraphic(1, 6, IMG_ARROW_BLUE_LEFT, 0); - DrawGraphic(1, 7, IMG_ARROW_BLUE_RIGHT, 0); - DrawGraphic(1, 8, IMG_ARROW_BLUE_UP, 0); - DrawGraphic(1, 9, IMG_ARROW_BLUE_DOWN, 0); + drawCursorXY(1, 4, IMG_ARROW_BLUE_LEFT); + drawCursorXY(1, 5, IMG_ARROW_BLUE_RIGHT); + drawCursorXY(1, 6, IMG_ARROW_BLUE_UP); + drawCursorXY(1, 7, IMG_ARROW_BLUE_DOWN); DrawText(SX+2*32, SY+6*32, ":", FS_BIG, FC_BLUE); DrawText(SX+2*32, SY+7*32, ":", FS_BIG, FC_BLUE); DrawText(SX+2*32, SY+8*32, ":", FS_BIG, FC_BLUE); @@ -2679,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) @@ -2762,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; @@ -2771,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, @@ -2806,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, @@ -2842,7 +2935,9 @@ static void CreateScreenScrollbars() for (i=0; iclip_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(); } +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