]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/gdiimage.cpp
Fixed a long-standing issue where wxSlider controls with a hardcoded size would mispl...
[wxWidgets.git] / src / os2 / gdiimage.cpp
index d3b1965074ffe4558683dd8be0f07baeddf9b757..1c134658804378a8fbe37f1af246a694b4b6c3a0 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     20.11.99
 // RCS-ID:      $Id$
 // Copyright:   (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
 #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 +65,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 +92,7 @@ public:
     }
 
     virtual bool LoadFile( wxBitmap*       pBitmap
-                          ,const wxString& rName
-                          ,HPS             hPs
+                          ,int             nId
                           ,long            lFlags
                           ,int             nDesiredWidth
                           ,int             nDesiredHeight
@@ -148,6 +162,16 @@ protected:
                           ,int             nDesiredWidth = -1
                           ,int             nDesiredHeight = -1
                          ) = 0;
+private:
+    inline virtual bool Load( wxGDIImage*     pImage
+                             ,int             nId
+                             ,long            lFlags
+                             ,int             nDesiredWidth
+                             ,int             nDesiredHeight
+                            )
+    {
+        return FALSE;
+    }
 };
 
 class WXDLLEXPORT wxICOFileHandler : public wxIconHandler
@@ -199,21 +223,15 @@ private:
 #if !USE_SHARED_LIBRARIES
     IMPLEMENT_DYNAMIC_CLASS(wxBMPFileHandler, wxBitmapHandler)
     IMPLEMENT_DYNAMIC_CLASS(wxBMPResourceHandler, wxBitmapHandler)
-    IMPLEMENT_DYNAMIC_CLASS(wxICOFileHandler, wxGDIImageHandler)
-    IMPLEMENT_DYNAMIC_CLASS(wxICOResourceHandler, wxGDIImageHandler)
+    IMPLEMENT_DYNAMIC_CLASS(wxICOFileHandler, wxObject)
+    IMPLEMENT_DYNAMIC_CLASS(wxICOResourceHandler, wxObject)
 #endif
 
-// ----------------------------------------------------------------------------
-// private functions
-// ----------------------------------------------------------------------------
-
-static wxSize GetHiconSize(WXHICON hicon);
-
 // ============================================================================
 // implementation
 // ============================================================================
 
-wxList wxGDIImage::ms_handlers;
+wxGDIImageHandlerList wxGDIImage::ms_handlers;
 
 // ----------------------------------------------------------------------------
 // wxGDIImage functions forwarded to wxGDIImageRefData
@@ -274,17 +292,17 @@ 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 +310,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 +361,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);
 }
@@ -360,43 +371,39 @@ void wxGDIImage::InitStandardHandlers()
 
 bool wxBMPResourceHandler::LoadFile(
   wxBitmap*                         pBitmap
-, const wxString&                   rName
-, HPS                               hPs
+, int                               nId
 , long                              lFlags
 , int                               nDesiredWidth
 , int                               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;
+        BITMAPINFOHEADER            vBmph;
 
-        if ( !::GetObject(GetHbitmapOf(*pBitmap), sizeof(BITMAP), (LPSTR) &bm) )
-        {
-            wxLogLastError("GetObject(HBITMAP)");
-        }
-
-        data->m_width = bm.bmWidth;
-        data->m_height = bm.bmHeight;
-        data->m_depth = bm.bmBitsPixel;
-    }
-    else
-    {
-        // it's probably not found
-        wxLogError(wxT("Can't load bitmap '%s' from resources! Check .rc file."),
-                   name.c_str());
+        ::GpiQueryBitmapParameters(GetHbitmapOf(*pBitmap), &vBmph);
+        pData->m_nWidth  = vBmph.cx;
+        pData->m_nHeight = vBmph.cy;
+        pData->m_nDepth  = vBmph.cBitCount;
     }
-
-    return bitmap->Ok();
-    */
-    return(FALSE);
-}
+    return(pBitmap->Ok());
+} // end of wxBMPResourceHandler::LoadFile
 
 bool wxBMPFileHandler::LoadFile(
   wxBitmap*                         pBitmap
@@ -469,44 +476,6 @@ bool wxICOFileHandler::LoadIcon(
     // 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);
 #else
     return(FALSE);
@@ -518,54 +487,21 @@ bool wxICOResourceHandler::LoadIcon(
 , const wxString&                   rName
 , HPS                               hPs
 , long                              lFlags
-, int                               nDesiredWidth
-, int                               nDesiredHeight
+, int                               WXUNUSED(nDesiredWidth)
+, int                               WXUNUSED(nDesiredHeight)
 )
 {
-    // TODO: load icon from a file
-    /*
-    HICON hicon;
+    HPOINTER                        hIcon;
 
-#if defined(__WIN32__) && !defined(__SC__)
-    if ( desiredWidth != -1 && desiredHeight != -1 )
-    {
-        hicon = (HICON)::LoadImage(wxGetInstance(), name, IMAGE_ICON,
-                                    desiredWidth, desiredHeight,
-                                    LR_DEFAULTCOLOR);
-    }
-    else
-#endif // Win32
-    {
-        hicon = ::LoadIcon(wxGetInstance(), name);
-    }
-
-    wxSize size = GetHiconSize(hicon);
-    icon->SetSize(size.x, size.y);
-
-    // Override the found values with desired values
-    if ( desiredWidth > -1 && desiredHeight > -1 )
-    {
-        icon->SetSize(desiredWidth, desiredHeight);
-    }
+    hIcon = ::WinLoadFileIcon( (PSZ)rName.c_str()
+                              ,TRUE // load for private use
+                             );
 
-    icon->SetHICON((WXHICON)hicon);
+    pIcon->SetSize(32, 32); // all OS/2 icons are 32 x 32
 
-    return icon->Ok();
-    */
-    return(FALSE);
-}
-
-// ----------------------------------------------------------------------------
-// private functions
-// ----------------------------------------------------------------------------
 
-static wxSize GetHiconSize(
-  WXHICON                           hicon
-)
-{
-    wxSize                          vSize(32, 32);    // default
+    pIcon->SetHICON((WXHICON)hIcon);
 
-    // all OS/2 icons are 32x32
-    return(vSize);
-}
+    return pIcon->Ok();
+} // end of wxICOResourceHandler::LoadIcon