/*
** 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 .
*/
// 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
#include
// 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