X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/22e90769f8da73d398bd7da83f185263a292972f..8ea45699503f23339525c17beeb9a7a50fbb2653:/src/os2/gdiimage.cpp diff --git a/src/os2/gdiimage.cpp b/src/os2/gdiimage.cpp index d4357d6331..0d21c81be0 100644 --- a/src/os2/gdiimage.cpp +++ b/src/os2/gdiimage.cpp @@ -1,12 +1,12 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: msw/gdiimage.cpp +// Name: src/os2/gdiimage.cpp // Purpose: wxGDIImage implementation // Author: Vadim Zeitlin // Modified by: // Created: 20.11.99 // RCS-ID: $Id$ // Copyright: (c) 1999 Vadim Zeitlin -// Licence: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -17,24 +17,21 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "gdiimage.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifndef WX_PRECOMP #include "wx/string.h" + #include "wx/app.h" #endif // WX_PRECOMP #include "wx/os2/private.h" - -#include "wx/app.h" - #include "wx/os2/gdiimage.h" +#include "wx/listimpl.cpp" +WX_DEFINE_LIST(wxGDIImageHandlerList) + // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- @@ -64,6 +61,20 @@ public: ); private: + inline virtual bool LoadFile( wxBitmap* pBitmap + ,int nId + ,long lFlags + ,int nDesiredWidth + ,int nDesiredHeight + ) + { + return wxBitmapHandler::LoadFile( pBitmap + ,nId + ,lFlags + ,nDesiredWidth + ,nDesiredHeight + ); + } DECLARE_DYNAMIC_CLASS(wxBMPFileHandler) }; @@ -77,8 +88,7 @@ public: } virtual bool LoadFile( wxBitmap* pBitmap - ,const wxString& rName - ,HPS hPs + ,int nId ,long lFlags ,int nDesiredWidth ,int nDesiredHeight @@ -103,14 +113,14 @@ public: // creating and saving icons is not supported virtual bool Create( wxGDIImage* WXUNUSED(pImage) - ,void* WXUNUSED(pData) + ,const void* WXUNUSED(pData) ,long WXUNUSED(lFlags) ,int WXUNUSED(nWidth) ,int WXUNUSED(nHeight) ,int WXUNUSED(nDepth) = 1 ) { - return(FALSE); + return false; } virtual bool Save( wxGDIImage* WXUNUSED(pImage) @@ -118,7 +128,7 @@ public: ,int WXUNUSED(nType) ) { - return(FALSE); + return false; } virtual bool Load( wxGDIImage* pImage ,const wxString& rName @@ -129,7 +139,7 @@ public: ) { wxIcon* pIcon = wxDynamicCast(pImage, wxIcon); - wxCHECK_MSG(pIcon, FALSE, _T("wxIconHandler only works with icons")); + wxCHECK_MSG(pIcon, false, _T("wxIconHandler only works with icons")); return LoadIcon( pIcon ,rName @@ -148,6 +158,15 @@ protected: ,int nDesiredWidth = -1 ,int nDesiredHeight = -1 ) = 0; +private: + inline virtual bool Load( wxGDIImage* WXUNUSED(pImage), + int WXUNUSED(nId), + long WXUNUSED(lFlags), + int WXUNUSED(nDesiredWidth), + int WXUNUSED(nDesiredHeight) ) + { + return false; + } }; class WXDLLEXPORT wxICOFileHandler : public wxIconHandler @@ -196,32 +215,22 @@ private: // wxWin macros // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARIES - IMPLEMENT_DYNAMIC_CLASS(wxBMPFileHandler, wxBitmapHandler) - IMPLEMENT_DYNAMIC_CLASS(wxBMPResourceHandler, wxBitmapHandler) - IMPLEMENT_DYNAMIC_CLASS(wxICOFileHandler, wxGDIImageHandler) - IMPLEMENT_DYNAMIC_CLASS(wxICOResourceHandler, wxGDIImageHandler) -#endif - -// ---------------------------------------------------------------------------- -// private functions -// ---------------------------------------------------------------------------- - -static wxSize GetHiconSize(WXHICON hicon); +IMPLEMENT_DYNAMIC_CLASS(wxBMPFileHandler, wxBitmapHandler) +IMPLEMENT_DYNAMIC_CLASS(wxBMPResourceHandler, wxBitmapHandler) +IMPLEMENT_DYNAMIC_CLASS(wxICOFileHandler, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxICOResourceHandler, wxObject) // ============================================================================ // implementation // ============================================================================ -wxList wxGDIImage::ms_handlers; +wxGDIImageHandlerList wxGDIImage::ms_handlers; // ---------------------------------------------------------------------------- // wxGDIImage functions forwarded to wxGDIImageRefData // ---------------------------------------------------------------------------- -bool wxGDIImage::FreeResource( - bool WXUNUSED(bForce) -) +bool wxGDIImage::FreeResource( bool WXUNUSED(bForce) ) { if ( !IsNull() ) { @@ -229,10 +238,10 @@ bool wxGDIImage::FreeResource( GetGDIImageData()->m_hHandle = 0; } - return(TRUE); + return true; } -WXHANDLE wxGDIImage::GetResourceHandle() +WXHANDLE wxGDIImage::GetResourceHandle() const { return GetHandle(); } @@ -241,50 +250,44 @@ WXHANDLE wxGDIImage::GetResourceHandle() // wxGDIImage handler stuff // ---------------------------------------------------------------------------- -void wxGDIImage::AddHandler( - wxGDIImageHandler* pHandler -) +void wxGDIImage::AddHandler( wxGDIImageHandler* pHandler ) { ms_handlers.Append(pHandler); } -void wxGDIImage::InsertHandler( - wxGDIImageHandler* pHandler -) +void wxGDIImage::InsertHandler( wxGDIImageHandler* pHandler ) { ms_handlers.Insert(pHandler); } -bool wxGDIImage::RemoveHandler( - const wxString& rName -) +bool wxGDIImage::RemoveHandler( const wxString& rName ) { wxGDIImageHandler* pHandler = FindHandler(rName); if (pHandler) { ms_handlers.DeleteObject(pHandler); - return(TRUE); + return true; } else - return(FALSE); + return false; } wxGDIImageHandler* wxGDIImage::FindHandler( const wxString& rName ) { - wxNode* pNode = ms_handlers.First(); + wxGDIImageHandlerList::compatibility_iterator pNode = ms_handlers.GetFirst(); - while (pNode) + while ( pNode ) { - wxGDIImageHandler* pHandler = (wxGDIImageHandler *)pNode->Data(); + wxGDIImageHandler* pHandler = pNode->GetData(); - if (pHandler->GetName() == rName) - return(pHandler); - pNode = pNode->Next(); + if ( pHandler->GetName() == rName ) + return pHandler; + pNode = pNode->GetNext(); } - return(NULL); + return((wxGDIImageHandler*)NULL); } wxGDIImageHandler* wxGDIImage::FindHandler( @@ -292,50 +295,49 @@ wxGDIImageHandler* wxGDIImage::FindHandler( , long lType ) { - wxNode* pNode = ms_handlers.First(); - - while (pNode) + wxGDIImageHandlerList::compatibility_iterator pNode = ms_handlers.GetFirst(); + while ( pNode ) { - wxGDIImageHandler* pHandler = (wxGDIImageHandler *)pNode->Data(); + wxGDIImageHandler* pHandler = pNode->GetData(); - if ((pHandler->GetExtension() = rExtension) && - (lType == -1 || pHandler->GetType() == lType)) + if ( (pHandler->GetExtension() = rExtension) && + (lType == -1 || pHandler->GetType() == lType) ) { - return(pHandler); + return pHandler; } - pNode = pNode->Next(); + pNode = pNode->GetNext(); } - return(NULL); + return((wxGDIImageHandler*)NULL); } wxGDIImageHandler* wxGDIImage::FindHandler( long lType ) { - wxNode* pNode = ms_handlers.First(); + wxGDIImageHandlerList::compatibility_iterator pNode = ms_handlers.GetFirst(); - while (pNode) + while ( pNode ) { - wxGDIImageHandler* pHandler = (wxGDIImageHandler *)pNode->Data(); + wxGDIImageHandler* pHandler = pNode->GetData(); - if (pHandler->GetType() == lType) + if ( pHandler->GetType() == lType ) return pHandler; - pNode = pNode->Next(); + pNode = pNode->GetNext(); } - return(NULL); + return((wxGDIImageHandler*)NULL); } void wxGDIImage::CleanUpHandlers() { - wxNode* pNode = ms_handlers.First(); + wxGDIImageHandlerList::compatibility_iterator pNode = ms_handlers.GetFirst(); - while (pNode) + while ( pNode ) { - wxGDIImageHandler* pHandler = (wxGDIImageHandler *)pNode->Data(); - wxNode* pNext = pNode->Next(); + wxGDIImageHandler* pHandler = pNode->GetData(); + wxGDIImageHandlerList::compatibility_iterator pNext = pNode->GetNext(); delete pHandler; - delete pNode; + ms_handlers.Erase( pNode ); pNode = pNext; } } @@ -344,12 +346,6 @@ void wxGDIImage::InitStandardHandlers() { AddHandler(new wxBMPResourceHandler); AddHandler(new wxBMPFileHandler); - - // Not added by default: include xpmhand.h in your app - // and call these in your wxApp::OnInit. - // AddHandler(new wxXPMFileHandler); - // AddHandler(new wxXPMDataHandler); - AddHandler(new wxICOResourceHandler); AddHandler(new wxICOFileHandler); } @@ -358,62 +354,54 @@ void wxGDIImage::InitStandardHandlers() // wxBitmap handlers // ---------------------------------------------------------------------------- -bool wxBMPResourceHandler::LoadFile( - wxBitmap* pBitmap -, const wxString& rName -, HPS hPs -, long lFlags -, int nDesiredWidth -, int nDesiredHeight -) +bool wxBMPResourceHandler::LoadFile( wxBitmap* pBitmap, + int nId, + long WXUNUSED(lFlags), + int WXUNUSED(nDesiredWidth), + int WXUNUSED(nDesiredHeight) ) { - // TODO: load a bitmap from a file - /* - rBitmap->SetHBITMAP((WXHBITMAP)::LoadBitmap(wxGetInstance(), rName)); - - wxBitmapRefData* pData = bitmap->GetBitmapData(); - - if (pBitmap->Ok()) + SIZEL vSize = {0, 0}; + DEVOPENSTRUC vDop = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L}; + HDC hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE); + HPS hPS = ::GpiCreatePS(vHabmain, hDC, &vSize, PU_PELS | GPIA_ASSOC); + + pBitmap->SetHBITMAP((WXHBITMAP)::GpiLoadBitmap( hPS + ,NULLHANDLE + ,nId + ,0 + ,0 + )); + ::GpiDestroyPS(hPS); + ::DevCloseDC(hDC); + + wxBitmapRefData* pData = pBitmap->GetBitmapData(); + + if ( pBitmap->Ok() ) { - BITMAP bm; - - if ( !::GetObject(GetHbitmapOf(*pBitmap), sizeof(BITMAP), (LPSTR) &bm) ) - { - wxLogLastError("GetObject(HBITMAP)"); - } + BITMAPINFOHEADER vBmph; - data->m_width = bm.bmWidth; - data->m_height = bm.bmHeight; - data->m_depth = bm.bmBitsPixel; + ::GpiQueryBitmapParameters(GetHbitmapOf(*pBitmap), &vBmph); + pData->m_nWidth = vBmph.cx; + pData->m_nHeight = vBmph.cy; + pData->m_nDepth = vBmph.cBitCount; } - else - { - // it's probably not found - wxLogError(wxT("Can't load bitmap '%s' from resources! Check .rc file."), - name.c_str()); - } - - return bitmap->Ok(); - */ - return(FALSE); -} - -bool wxBMPFileHandler::LoadFile( - wxBitmap* pBitmap -, const wxString& rName -, HPS hPs -, long WXUNUSED(lFlags) -, int WXUNUSED(nDesiredWidth) -, int WXUNUSED(nDesiredHeight) -) + return(pBitmap->Ok()); +} // end of wxBMPResourceHandler::LoadFile + +bool wxBMPFileHandler::LoadFile( wxBitmap* pBitmap, + const wxString& WXUNUSED(rName), + HPS WXUNUSED(hPs), + long WXUNUSED(lFlags), + int WXUNUSED(nDesiredWidth), + int WXUNUSED(nDesiredHeight) ) { -#if wxUSE_IMAGE_LOADING_IN_OS2 - wxPalette* pPalette = NULL; +#if defined(wxUSE_IMAGE_LOADING_IN_OS2) && wxUSE_IMAGE_LOADING_IN_OS2 + wxPalette* pPalette = NULL; - bool bSuccess = FALSE; /* wxLoadIntoBitmap( WXSTRINGCAST rName - ,pBitmap - ,&pPalette - ) != 0; */ + bool bSuccess = false; /* wxLoadIntoBitmap( WXSTRINGCAST rName + ,pBitmap + ,&pPalette + ) != 0; */ if (bSuccess && pPalette) { pBitmap->SetPalette(*pPalette); @@ -424,19 +412,18 @@ bool wxBMPFileHandler::LoadFile( return(bSuccess); #else - return(FALSE); + wxUnusedVar(pBitmap); + return false; #endif } -bool wxBMPFileHandler::SaveFile( - wxBitmap* pBitmap -, const wxString& rName -, int WXUNUSED(nType) -, const wxPalette* pPal -) +bool wxBMPFileHandler::SaveFile( wxBitmap* pBitmap, + const wxString& WXUNUSED(rName), + int WXUNUSED(nType), + const wxPalette* pPal ) { -#if wxUSE_IMAGE_LOADING_IN_OS2 - wxPalette* pActualPalette = (wxPalette *)pPal; +#if defined(wxUSE_IMAGE_LOADING_IN_OS2) && wxUSE_IMAGE_LOADING_IN_OS2 + wxPalette* pActualPalette = (wxPalette *)pPal; if (!pActualPalette) pActualPalette = pBitmap->GetPalette(); @@ -444,9 +431,11 @@ bool wxBMPFileHandler::SaveFile( ,pBitmap ,pActualPalette ) != 0); */ - return(FALSE); + return false; #else - return(FALSE); + wxUnusedVar(pBitmap); + wxUnusedVar(pPal); + return false; #endif } @@ -454,73 +443,29 @@ bool wxBMPFileHandler::SaveFile( // wxIcon handlers // ---------------------------------------------------------------------------- -bool wxICOFileHandler::LoadIcon( - wxIcon* pIcon -, const wxString& rName -, HPS hPs -, long lFlags -, int nDesiredWidth -, int nDesiredHeight -) +bool wxICOFileHandler::LoadIcon( wxIcon* pIcon, + const wxString& WXUNUSED(rName), + HPS WXUNUSED(hPs), + long WXUNUSED(lFlags), + int WXUNUSED(nDesiredWidth), + int WXUNUSED(nDesiredHeight) ) { -#if wxUSE_RESOURCE_LOADING_IN_OS2 +#if defined(wxUSE_RESOURCE_LOADING_IN_OS2) && wxUSE_RESOURCE_LOADING_IN_OS2 pIcon->UnRef(); - // actual size - wxSize vSize; - - // TODO: load icon directly from a file - /* -#ifdef __WIN32__ - HICON hicon = ::ExtractIcon(wxGetInstance(), name, first); - if ( !hicon ) - { - wxLogSysError(_T("Failed to load icon from the file '%s'"), - name.c_str()); - - return FALSE; - } - - size = GetHiconSize(hicon); -#else // Win16 - HICON hicon = ReadIconFile((wxChar *)name.c_str(), - wxGetInstance(), - &size.x, &size.y); -#endif // Win32/Win16 - - if ( (desiredWidth != -1 && desiredWidth != size.x) || - (desiredHeight != -1 && desiredHeight != size.y) ) - { - wxLogDebug(_T("Returning FALSE from wxICOFileHandler::Load because " - "of the size mismatch: actual (%d, %d), " - "requested (%d, %d)"), - size.x, size.y, - desiredWidth, desiredHeight); - - ::DestroyIcon(hicon); - - return FALSE; - } - - icon->SetHICON((WXHICON)hicon); - icon->SetSize(size.x, size.y); - - return icon->Ok(); - */ - return(FALSE); + return false; #else - return(FALSE); + wxUnusedVar(pIcon); + return false; #endif } -bool wxICOResourceHandler::LoadIcon( - wxIcon* pIcon -, const wxString& rName -, HPS hPs -, long lFlags -, int WXUNUSED(nDesiredWidth) -, int WXUNUSED(nDesiredHeight) -) +bool wxICOResourceHandler::LoadIcon( wxIcon* pIcon, + const wxString& rName, + HPS WXUNUSED(hPs), + long WXUNUSED(lFlags), + int WXUNUSED(nDesiredWidth), + int WXUNUSED(nDesiredHeight) ) { HPOINTER hIcon; @@ -530,23 +475,7 @@ bool wxICOResourceHandler::LoadIcon( pIcon->SetSize(32, 32); // all OS/2 icons are 32 x 32 - pIcon->SetHICON((WXHICON)hIcon); return pIcon->Ok(); } // end of wxICOResourceHandler::LoadIcon - -// ---------------------------------------------------------------------------- -// private functions -// ---------------------------------------------------------------------------- - -static wxSize GetHiconSize( - WXHICON hicon -) -{ - wxSize vSize(32, 32); // default - - // all OS/2 icons are 32x32 - return(vSize); -} -