Author: mlytwyn
Date: Wed Jun  1 21:24:10 2016
New Revision: 39835

URL: http://svn.gna.org/viewcvs/gnustep?rev=39835&view=rev
Log:
Siwtch to using GDI Plus for converting images to icons

Modified:
    
libs/back/branches/gnustep_testplant_branch/Source/win32/MSUserNotifications/GNUmakefile
    
libs/back/branches/gnustep_testplant_branch/Source/win32/MSUserNotifications/MSUserNotification.mm

Modified: 
libs/back/branches/gnustep_testplant_branch/Source/win32/MSUserNotifications/GNUmakefile
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/back/branches/gnustep_testplant_branch/Source/win32/MSUserNotifications/GNUmakefile?rev=39835&r1=39834&r2=39835&view=diff
==============================================================================
--- 
libs/back/branches/gnustep_testplant_branch/Source/win32/MSUserNotifications/GNUmakefile
    (original)
+++ 
libs/back/branches/gnustep_testplant_branch/Source/win32/MSUserNotifications/GNUmakefile
    Wed Jun  1 21:24:10 2016
@@ -27,7 +27,7 @@
 NSUserNotification_PRINCIPAL_CLASS = MSUserNotificationCenter
 NSUserNotification_OBJC_FILES =
 NSUserNotification_OBJCC_FILES = MSUserNotification.mm
-NSUserNotification_BUNDLE_LIBS = -lgnustep-gui -lgdi32
+NSUserNotification_BUNDLE_LIBS = -lgnustep-gui -lgdi32 -lgdiplus
 #NSUserNotification_LIBS = stdc++
 #NSUserNotification_INCLUDE_DIRS += \
 #  -I/mingw/lib/gcc/mingw32/4.8.1/include/c++/mingw32 \

Modified: 
libs/back/branches/gnustep_testplant_branch/Source/win32/MSUserNotifications/MSUserNotification.mm
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/back/branches/gnustep_testplant_branch/Source/win32/MSUserNotifications/MSUserNotification.mm?rev=39835&r1=39834&r2=39835&view=diff
==============================================================================
--- 
libs/back/branches/gnustep_testplant_branch/Source/win32/MSUserNotifications/MSUserNotification.mm
  (original)
+++ 
libs/back/branches/gnustep_testplant_branch/Source/win32/MSUserNotifications/MSUserNotification.mm
  Wed Jun  1 21:24:10 2016
@@ -50,6 +50,10 @@
 #include <windows.h>
 #include <ShellAPI.h>
 #include <shlwapi.h>
+#include <gdiplus/gdiplus.h>
+
+#include <iostream>
+#include <string>
 
 #if defined(__cplusplus)
 extern "C" {
@@ -210,7 +214,7 @@
   NSImage  *image       = nil;
   NSString *appIconFile = [infoDict objectForKey: @"NSIcon"];
   
-  if (appIconFile && ![appIconFile isEqual: @""] && ![[appIconFile 
pathExtension] isEqual: @"png"])
+  if (appIconFile && ![appIconFile isEqual: @""])
   {
     image = [NSImage imageNamed: appIconFile];
   }
@@ -219,7 +223,7 @@
   {
     // Try to look up the icns file.
     appIconFile = [infoDict objectForKey: @"CFBundleIconFile"];
-    if (appIconFile && ![appIconFile isEqual: @""] && ![[appIconFile 
pathExtension] isEqual: @"png"])
+    if (appIconFile && ![appIconFile isEqual: @""])
     {
       image = [NSImage imageNamed: appIconFile];
     }
@@ -247,142 +251,11 @@
   return image;
 }
 
-- (HICON) _iconFromRep: (NSBitmapImageRep*)rep
-{
-  HICON result = NULL;
-  
-  if (rep)
-  {
-    int w = [rep pixelsWide];
-    int h = [rep pixelsHigh];
-    
-    // Create a windows bitmap from the image representation's bitmap...
-    if ((w > 0) && (h > 0))
-    {
-      BITMAP    bm;
-      HDC       hDC             = GetDC(NULL);
-      HDC       hMainDC         = CreateCompatibleDC(hDC);
-      HDC       hAndMaskDC      = CreateCompatibleDC(hDC);
-      HDC       hXorMaskDC      = CreateCompatibleDC(hDC);      
-      HBITMAP   hAndMaskBitmap  = NULL;
-      HBITMAP   hXorMaskBitmap  = NULL;
-      
-      // Create the source bitmap...
-      HBITMAP hSourceBitmap = CreateBitmap(w, h, [rep numberOfPlanes], [rep 
bitsPerPixel], [rep bitmapData]);
-      
-      // Get the dimensions of the source bitmap
-      GetObject(hSourceBitmap, sizeof(BITMAP), &bm);
-      
-      // Create compatible bitmaps for the device context...
-      hAndMaskBitmap = CreateCompatibleBitmap(hDC, bm.bmWidth, bm.bmHeight);
-      hXorMaskBitmap = CreateCompatibleBitmap(hDC, bm.bmWidth, bm.bmHeight);
-      
-      // Select the bitmaps to DC
-      HBITMAP hOldMainBitmap    = (HBITMAP)SelectObject(hMainDC, 
hSourceBitmap);
-      HBITMAP hOldAndMaskBitmap = (HBITMAP)SelectObject(hAndMaskDC, 
hAndMaskBitmap);
-      HBITMAP hOldXorMaskBitmap = (HBITMAP)SelectObject(hXorMaskDC, 
hXorMaskBitmap);
-      
-      /* On windows, to calculate the color for a pixel, first an AND is done
-       * with the background and the "and" bitmap, then an XOR with the "xor"
-       * bitmap. This means that when the data in the "and" bitmap is 0, the
-       * pixel will get the color as specified in the "xor" bitmap.
-       * However, if the data in the "and" bitmap is 1, the result will be the
-       * background XOR'ed with the value in the "xor" bitmap. In case the 
"xor"
-       * data is completely black (0x000000) the pixel will become transparent,
-       * in case it's white (0xffffff) the pixel will become the inverse of the
-       * background color.
-       */
-
-      // Scan each pixel of the souce bitmap and create the masks
-      int y;
-      int *pixel = (int*)[rep bitmapData];
-      for(y = 0; y < bm.bmHeight; ++y)
-      {
-        int x;
-        for (x = 0; x < bm.bmWidth; ++x)
-          {
-            if (*pixel++ == 0x00000000)
-              {
-                SetPixel(hAndMaskDC, x, y, RGB(255, 255, 255));
-                SetPixel(hXorMaskDC, x, y, RGB(0, 0, 0));
-              }
-            else
-              {
-                SetPixel(hAndMaskDC, x, y, RGB(0, 0, 0));
-                SetPixel(hXorMaskDC, x, y, GetPixel(hMainDC, x, y));
-              }
-          }
-      }
-    
-      // Reselect the old bitmap objects...
-      SelectObject(hMainDC, hOldMainBitmap);
-      SelectObject(hAndMaskDC, hOldAndMaskBitmap);
-      SelectObject(hXorMaskDC, hOldXorMaskBitmap);
-      
-      // Create the cursor from the generated and/xor data...
-      ICONINFO iconinfo = { 0 };
-      iconinfo.fIcon    = FALSE;
-      iconinfo.xHotspot = 0;
-      iconinfo.yHotspot = 0;
-      iconinfo.hbmMask  = hAndMaskBitmap;
-      iconinfo.hbmColor = hXorMaskBitmap;
-      
-      // Finally, try to create the cursor...
-      result = CreateIconIndirect(&iconinfo);
-
-      // Cleanup the DC's...
-      DeleteDC(hXorMaskDC);
-      DeleteDC(hAndMaskDC);
-      DeleteDC(hMainDC);
-      
-      // Cleanup the bitmaps...
-      DeleteObject(hXorMaskBitmap);
-      DeleteObject(hAndMaskBitmap);
-      DeleteObject(hSourceBitmap);
-      
-      // Release the screen HDC...
-      ReleaseDC(NULL,hDC);
-    }
-  }
-  
-  return(result);
-}
-
-- (NSBitmapImageRep*) _getStandardBitmap:(NSImage *)image
-{
-  NSBitmapImageRep *rep;
-  
-  if (image == nil)
-  {
-    return nil;
-  }
-  
-  rep = (NSBitmapImageRep *)[image bestRepresentationForDevice: nil];
-  if (!rep || ![rep respondsToSelector: @selector(samplesPerPixel)])
-  {
-    /* FIXME: We might create a blank cursor here? */
-    //NSLog(@"%s:could not convert cursor bitmap data for image: %@", 
__PRETTY_FUNCTION__, image);
-    return nil;
-  }
-  else
-  {
-    // Convert into something usable by the backend
-    return [rep _convertToFormatBitsPerSample: 8
-                              samplesPerPixel: [rep hasAlpha] ? 4 : 3
-                                     hasAlpha: [rep hasAlpha]
-                                     isPlanar: NO
-                               colorSpaceName: NSCalibratedRGBColorSpace
-                                 bitmapFormat: 0
-                                  bytesPerRow: 0
-                                 bitsPerPixel: 0];
-  }
-}
-
 - (HICON) _iconFromImage: (NSImage *)image
 {
   // Default the return cursur ID to NULL...
   HICON result = NULL;
-
+  
 #if defined(DEBUG)
   NSLog(@"%s:image: %@ imageToIcon dict: %@", __PRETTY_FUNCTION__, image, 
imageToIcon);
 #endif
@@ -399,25 +272,56 @@
   }
   else
   {
-    NSBitmapImageRep *rep = [self _getStandardBitmap:image];
+    // Try to create the icon from the image...
+    Gdiplus::GdiplusStartupInput  startupInput;
+    Gdiplus::GdiplusStartupOutput startupOutput;
+    ULONG_PTR                     gdiplusToken;
     
-    if (rep == NULL)
-    {
-      NSLog(@"%s:error creating standard bitmap for image: %@", 
__PRETTY_FUNCTION__, image);
+    // Using GDI Plus requires startup/shutdown...
+    Gdiplus::Status startStatus = Gdiplus::GdiplusStartup(&gdiplusToken, 
&startupInput, &startupOutput);
+    if (startStatus != Gdiplus::Ok)
+    {
+        NSLog(@"%s:error on GdiplusStartup - status: %d GetLastError: %d", 
__PRETTY_FUNCTION__, startStatus, GetLastError());
     }
     else
     {
-      // Try to create the icon from the image...
-      result = [self _iconFromRep:rep];
-      
-      // Need to save these created cursors to remove later...
-      if (result != NULL)
+      std::string  filename8 = [[image _filename] UTF8String];
+      std::wstring filename16(filename8.length(), L' ');                       
// Make room for characters
+      std::copy(filename8.begin(), filename8.end(), filename16.begin()); // 
Copy string to wstring.
+      std::cout << __PRETTY_FUNCTION__ << ":filename8: " << filename8 << " 
filename16: " << filename16.c_str() << std::endl;
+      Gdiplus::Bitmap *bitmap = new Gdiplus::Bitmap(filename16.c_str());
+      Gdiplus::Status status = bitmap->GetHICON(&result);
+
+      // Check icon create status...
+      if (status != Gdiplus::Ok)
       {
-        [imageToIcon setObject:[NSValue valueWithPointer:result] forKey:[image 
name]];
-#if defined(DEBUG)
-        NSLog(@"%s:saving icon: %p for imageName: %@", __PRETTY_FUNCTION__, 
result, [image name]);
-#endif
+        NSLog(@"%s:error creating icon from bitmap - status: %d GetLastError: 
%d", __PRETTY_FUNCTION__, status, GetLastError());
       }
+#if 0 // For debugging...
+      else
+      {
+        ICONINFO iconinfo;
+        if (GetIconInfo(result, &iconinfo) == 0)
+        {
+          NSLog(@"%s:error GetIconInfo error - status: %d GetLastError: %d", 
__PRETTY_FUNCTION__, GetLastError());
+          DestroyIcon(result);
+        }
+        NSLog(@"%s:result: %p fIcon: %d X: %d Y: %d", __PRETTY_FUNCTION__, 
result, iconinfo.fIcon, iconinfo.xHotspot, iconinfo.yHotspot);
+      }
+#endif
+      
+      // Cleanup objects abnd shutdown GDI Plus...
+      delete bitmap;
+      Gdiplus::GdiplusShutdown(gdiplusToken);
+    }
+      
+    // Need to save these created cursors to remove later...
+    if (result != NULL)
+    {
+      [imageToIcon setObject:[NSValue valueWithPointer:result] forKey:[image 
name]];
+#if defined(DEBUG)
+      NSLog(@"%s:saving icon: %p for imageName: %@", __PRETTY_FUNCTION__, 
result, [image name]);
+#endif
     }
   }
   


_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to