| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- /*
- ** Command & Conquer Generals Zero Hour(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- // FILE: ImagePackerProc.cpp //////////////////////////////////////////////////
- //-----------------------------------------------------------------------------
- //
- // Westwood Studios Pacific.
- //
- // Confidential Information
- // Copyright (C) 2001 - All Rights Reserved
- //
- //-----------------------------------------------------------------------------
- //
- // Project: ImagePacker
- //
- // File name: ImagePackerProc.cpp
- //
- // Created: Colin Day, August 2001
- //
- // Desc: Window procedure for the image packer app
- //
- //-----------------------------------------------------------------------------
- ///////////////////////////////////////////////////////////////////////////////
- // SYSTEM INCLUDES ////////////////////////////////////////////////////////////
- #include <windows.h>
- #include <io.h>
- // USER INCLUDES //////////////////////////////////////////////////////////////
- #include "ImagePacker.h"
- #include "Resource.h"
- #include "WindowProc.h"
- #include "WinMain.h"
- // DEFINES ////////////////////////////////////////////////////////////////////
- // PRIVATE TYPES //////////////////////////////////////////////////////////////
- // PRIVATE DATA ///////////////////////////////////////////////////////////////
- // PUBLIC DATA ////////////////////////////////////////////////////////////////
- // PRIVATE PROTOTYPES /////////////////////////////////////////////////////////
- // PRIVATE FUNCTIONS //////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- // PUBLIC FUNCTIONS ///////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- // ImagePackerProc ============================================================
- /** Dialog procedure for the program flow */
- //=============================================================================
- BOOL CALLBACK ImagePackerProc( HWND hWndDialog, UINT message,
- WPARAM wParam, LPARAM lParam )
- {
- switch( message )
- {
- // ------------------------------------------------------------------------
- case WM_INITDIALOG:
- {
- // we must have our program interface to continue
- if( TheImagePacker == NULL )
- {
- MessageBox( NULL, "Internal Error, 'TheImagePacker' not initialized",
- "Internal Error", MB_OK );
- EndDialog( hWndDialog, FALSE );
- } // end if
- // save our window handlw
- TheImagePacker->setWindowHandle( hWndDialog );
- // get size of the screen
- Int x, y;
- x = GetSystemMetrics( SM_CXFULLSCREEN );
- y = GetSystemMetrics( SM_CYFULLSCREEN );
- // get size of our dialog
- RECT rect;
- ICoord2D size;
- GetWindowRect( hWndDialog, &rect );
- size.x = rect.right - rect.left;
- size.y = rect.bottom - rect.top;
- // center dialog on screen
- MoveWindow( hWndDialog,
- (x / 2) - (size.x / 2),
- (y / 2) - (size.y / 2),
- size.x,
- size.y,
- TRUE );
- // setup the status message
- TheImagePacker->statusMessage( "Select options and click 'Start'." );
- // set gutter size
- SetDlgItemInt( hWndDialog, EDIT_GUTTER, TheImagePacker->getGutter(), FALSE );
-
- // set alpha check
- if( TheImagePacker->getOutputAlpha() )
- CheckDlgButton( hWndDialog, CHECK_ALPHA, BST_CHECKED );
- // set the check for preview using the actual texture
- if( TheImagePacker->getUseTexturePreview() )
- CheckDlgButton( hWndDialog, CHECK_BITMAP_PREVIEW, BST_CHECKED );
- // set the check for creating INI definition
- if( TheImagePacker->createINIFile() )
- CheckDlgButton( hWndDialog, CHECK_INI, BST_CHECKED );
- // check the resursive checkbox by default
- CheckDlgButton( hWndDialog, CHECK_USE_SUB_FOLDERS, BST_CHECKED );
- // check the default image size radio button
- CheckDlgButton( hWndDialog, RADIO_512X512, BST_CHECKED );
- // fill out a default target filename
- SetDlgItemText( hWndDialog, EDIT_FILENAME, "NewImage" );
- // limit the size if the filename edit box
- SendDlgItemMessage( hWndDialog, EDIT_FILENAME,
- EM_LIMITTEXT, MAX_OUTPUT_FILE_LEN, 0 );
- // set options for compressed textures
- if( TheImagePacker->getCompressTextures() )
- CheckDlgButton( hWndDialog, CHECK_COMPRESS, BST_CHECKED );
- // set option checks for gap method
- UnsignedInt gapOptions = TheImagePacker->getGapMethod();
- if( BitTest( gapOptions, ImagePacker::GAP_METHOD_EXTEND_RGB ) )
- CheckDlgButton( hWndDialog, CHECK_GAP_EXTEND_RGB, BST_CHECKED );
- if( BitTest( gapOptions, ImagePacker::GAP_METHOD_GUTTER ) )
- CheckDlgButton( hWndDialog, CHECK_GAP_GUTTER, BST_CHECKED );
- return TRUE;
- } // end init dialog
- // ------------------------------------------------------------------------
- case WM_COMMAND:
- {
- Int notifyCode = HIWORD( wParam );
- Int controlID = LOWORD( wParam );
- // HWND hWndControl = (HWND)lParam;
- switch( controlID )
- {
- // --------------------------------------------------------------------
- case BUTTON_PREVIOUS:
- {
- Int page = TheImagePacker->getTargetPreviewPage();
- // target preview page back one
- if( page > 1 )
- {
- page--;
- TheImagePacker->setTargetPreviewPage( page );
- UpdatePreviewWindow();
- } // end if
- break;
- } // end previous
- // --------------------------------------------------------------------
- case BUTTON_NEXT:
- {
- UnsignedInt page = TheImagePacker->getTargetPreviewPage();
- if( page < TheImagePacker->getPageCount() )
- {
- page++;
- TheImagePacker->setTargetPreviewPage( page );
- UpdatePreviewWindow();
- } // end if
- break;
- } // end next
- // --------------------------------------------------------------------
- case CHECK_BITMAP_PREVIEW:
- {
- Bool useBitmap;
- if( IsDlgButtonChecked( hWndDialog, controlID ) == BST_CHECKED )
- useBitmap = TRUE;
- else
- useBitmap = FALSE;
- TheImagePacker->setUseTexturePreview( useBitmap );
- UpdatePreviewWindow();
- break;
- } // end preview using image
- // --------------------------------------------------------------------
- case CHECK_GAP_GUTTER:
- {
- Bool enable = FALSE;
- if( IsDlgButtonChecked( hWndDialog, controlID ) == BST_CHECKED )
- enable = TRUE;
- EnableWindow( GetDlgItem( hWndDialog, STATIC_GAP_INFO ), enable );
- EnableWindow( GetDlgItem( hWndDialog, EDIT_GUTTER ), enable );
- break;
- } // end transparent gutter
- // --------------------------------------------------------------------
- case BUTTON_PREVIEW:
- {
- HWND preview = TheImagePacker->getPreviewWindow();
- if( preview )
- {
- // delete test display window
- DestroyWindow( preview );
- TheImagePacker->setPreviewWindow( NULL );
- SetDlgItemText( hWndDialog, BUTTON_PREVIEW, "Open Preview" );
- } // end if
- else
- {
- HWND preview = MakePreviewDisplay();
- if( preview )
- {
- TheImagePacker->setPreviewWindow( preview );
- UpdatePreviewWindow();
- SetDlgItemText( hWndDialog, BUTTON_PREVIEW, "Close Preview" );
- } // end if
- } // end else
- break;
- } // end test
- // --------------------------------------------------------------------
- case BUTTON_ADD_FOLDER:
- {
- // bring up the add directory dialog
- DialogBox( ApplicationHInstance,
- (LPCTSTR)DIRECTORY_SELECT_DIALOG,
- TheImagePacker->getWindowHandle(),
- (DLGPROC)DirectorySelectProc );
- break;
- } // end add folder
- // --------------------------------------------------------------------
- case BUTTON_REMOVE_FOLDER:
- {
- HWND folderList;
- // get the directory listbox
- folderList = GetDlgItem( hWndDialog, LIST_FOLDERS );
- if( folderList == NULL )
- break;;
- // get the selected item in the folder listbox
- Int selCount;
- selCount = SendMessage( folderList, LB_GETSELCOUNT, 0, 0 );
- if( selCount == 0 )
- {
- MessageBox( NULL, "You must first select a folder to remove it",
- "Select Folder First", MB_OK | MB_ICONINFORMATION );
- break;
- } // end if
- //
- // start at the end of the listbox, delete any items that
- // are selected
- //
- Int itemCount = SendMessage( folderList, LB_GETCOUNT, 0, 0 );
- for( Int i = itemCount - 1; i >= 0; i-- )
- if( SendMessage( folderList, LB_GETSEL, i, 0 ) > 0 )
- SendMessage( folderList, LB_DELETESTRING, i, 0 );
- break;
- } // end remove folder
- // --------------------------------------------------------------------
- case RADIO_128X128:
- case RADIO_256X256:
- case RADIO_512X512:
- case RADIO_TARGET_OTHER:
- {
- Bool enable;
- //
- // if this is the other button, enable the first edit box for
- // user size, if not, disable that section of the UI
- //
- enable = IsDlgButtonChecked( hWndDialog, RADIO_TARGET_OTHER );
- EnableWindow( GetDlgItem( hWndDialog, EDIT_WIDTH ), enable );
- EnableWindow( GetDlgItem( hWndDialog, STATIC_X ), enable );
- break;
- } // end target image size radio buttons
- // --------------------------------------------------------------------
- case EDIT_WIDTH:
- {
- switch( notifyCode )
- {
- // ----------------------------------------------------------------
- case EN_UPDATE:
- {
- char buffer[ 32 ];
- //
- // the text of the width has changed, since our requirements
- // are that the image must be square automatically update
- // the height box as well
- //
- GetDlgItemText( hWndDialog, EDIT_WIDTH, buffer, 32 );
- SetDlgItemText( hWndDialog, EDIT_HEIGHT, buffer );
- break;
-
- } // end update
- } // end switch
- break;
- } // end user defined width
- // --------------------------------------------------------------------
- case BUTTON_START:
- {
- Bool success;
- // get all the options from the dialog into the image packer
- success = TheImagePacker->getSettingsFromDialog( hWndDialog );
- // run the packer if nothing went wrong
- if( success )
- TheImagePacker->process();
- break;
- } // end execute
- // --------------------------------------------------------------------
- case BUTTON_EXIT:
- {
- // quit the program
- EndDialog( hWndDialog, TRUE );
- break;
- } // end exit
- } // end switch
- return 0;
- } // end command
- } // end switch
- return 0;
- } // end ImagePackerProc
|