Hans Leidekker : gdi32: Move GetICMProfile to the driver.

Alexandre Julliard julliard at winehq.org
Wed Mar 5 13:41:15 CST 2008


Module: wine
Branch: master
Commit: 81e9b43fb246a07793d62563a826c9c3bbfa767f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=81e9b43fb246a07793d62563a826c9c3bbfa767f

Author: Hans Leidekker <hans at it.vu.nl>
Date:   Wed Mar  5 15:57:21 2008 +0100

gdi32: Move GetICMProfile to the driver.

---

 dlls/gdi32/driver.c               |    1 +
 dlls/gdi32/enhmfdrv/init.c        |    1 +
 dlls/gdi32/gdi_private.h          |    1 +
 dlls/gdi32/icm.c                  |   49 ++++++--------------------------
 dlls/gdi32/mfdrv/init.c           |    1 +
 dlls/winex11.drv/graphics.c       |   57 +++++++++++++++++++++++++++++++++++++
 dlls/winex11.drv/winex11.drv.spec |    1 +
 7 files changed, 71 insertions(+), 40 deletions(-)

diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index 31810b0..8d75803 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -116,6 +116,7 @@ static struct graphics_driver *create_driver( HMODULE module )
         GET_FUNC(GetDIBits);
         GET_FUNC(GetDeviceCaps);
         GET_FUNC(GetDeviceGammaRamp);
+        GET_FUNC(GetICMProfile);
         GET_FUNC(GetNearestColor);
         GET_FUNC(GetPixel);
         GET_FUNC(GetPixelFormat);
diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c
index 0db9ff6..2203ced 100644
--- a/dlls/gdi32/enhmfdrv/init.c
+++ b/dlls/gdi32/enhmfdrv/init.c
@@ -75,6 +75,7 @@ static const DC_FUNCTIONS EMFDRV_Funcs =
     NULL,                            /* pGetDIBits */
     EMFDRV_GetDeviceCaps,            /* pGetDeviceCaps */
     NULL,                            /* pGetDeviceGammaRamp */
+    NULL,                            /* pGetICMProfile */
     NULL,                            /* pGetNearestColor */
     NULL,                            /* pGetPixel */
     NULL,                            /* pGetPixelFormat */
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index dc66a0c..e3a320a 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -140,6 +140,7 @@ typedef struct tagDC_FUNCS
     INT      (*pGetDIBits)(PHYSDEV,HBITMAP,UINT,UINT,LPVOID,BITMAPINFO*,UINT);
     INT      (*pGetDeviceCaps)(PHYSDEV,INT);
     BOOL     (*pGetDeviceGammaRamp)(PHYSDEV,LPVOID);
+    BOOL     (*pGetICMProfile)(PHYSDEV,LPDWORD,LPWSTR);
     COLORREF (*pGetNearestColor)(PHYSDEV,COLORREF);
     COLORREF (*pGetPixel)(PHYSDEV,INT,INT);
     INT      (*pGetPixelFormat)(PHYSDEV);
diff --git a/dlls/gdi32/icm.c b/dlls/gdi32/icm.c
index 12d1f3b..0e346ee 100644
--- a/dlls/gdi32/icm.c
+++ b/dlls/gdi32/icm.c
@@ -30,6 +30,8 @@
 #include "winnls.h"
 #include "winreg.h"
 
+#include "gdi_private.h"
+
 #include "wine/debug.h"
 #include "wine/unicode.h"
 
@@ -97,51 +99,18 @@ BOOL WINAPI GetICMProfileA(HDC hdc, LPDWORD size, LPSTR filename)
  */
 BOOL WINAPI GetICMProfileW(HDC hdc, LPDWORD size, LPWSTR filename)
 {
-    HKEY hkey;
-    DWORD required;
-    WCHAR profile[MAX_PATH], fullname[MAX_PATH];
-    static const WCHAR path[] =
-        {'\\','s','p','o','o','l','\\','d','r','i','v','e','r','s',
-         '\\','c','o','l','o','r','\\',0};
-    static const WCHAR srgb[] =
-        {'s','R','G','B',' ','C','o','l','o','r',' ','S','p','a','c','e',' ',
-         'P','r','o','f','i','l','e','.','i','c','m',0};
-    static const WCHAR mntr[] =
-        {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
-         'W','i','n','d','o','w','s',' ','N','T','\\','C','u','r','r','e','n','t',
-         'V','e','r','s','i','o','n','\\','I','C','M','\\','m','n','t','r',0};
+    BOOL ret = FALSE;
+    DC *dc = get_dc_ptr(hdc);
 
     TRACE("%p, %p, %p\n", hdc, size, filename);
 
-    if (!hdc || !size) return FALSE;
-
-    strcpyW(profile, srgb);
-    if (!RegCreateKeyExW(HKEY_LOCAL_MACHINE, mntr, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkey, NULL))
-    {
-        DWORD size = sizeof(profile) / sizeof(WCHAR);
-        /* FIXME handle multiple values */
-        RegEnumValueW(hkey, 0, profile, &size, NULL, NULL, NULL, NULL);
-        RegCloseKey(hkey);
-    }
-    GetSystemDirectoryW(fullname, MAX_PATH);
-    strcatW(fullname, path);
-    strcatW(fullname, profile);
-
-    required = strlenW(fullname) + 1;
-    if (*size < required)
-    {
-        *size = required;
-        SetLastError(ERROR_INSUFFICIENT_BUFFER);
-        return FALSE;
-    }
-    if (filename)
+    if (dc)
     {
-        strcpyW(filename, fullname);
-        if (GetFileAttributesW(filename) == INVALID_FILE_ATTRIBUTES)
-            WARN("color profile not found\n");
+        if (dc->funcs->pGetICMProfile)
+            ret = dc->funcs->pGetICMProfile(dc->physDev, size, filename);
+        release_dc_ptr(dc);
     }
-    *size = required;
-    return TRUE;
+    return ret;
 }
 
 /**********************************************************************
diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c
index c2cf404..69e5b55 100644
--- a/dlls/gdi32/mfdrv/init.c
+++ b/dlls/gdi32/mfdrv/init.c
@@ -75,6 +75,7 @@ static const DC_FUNCTIONS MFDRV_Funcs =
     NULL,                            /* pGetDIBits */
     MFDRV_GetDeviceCaps,             /* pGetDeviceCaps */
     NULL,                            /* pGetDeviceGammaRamp */
+    NULL,                            /* pGetICMProfile */
     NULL,                            /* pGetNearestColor */
     NULL,                            /* pGetPixel */
     NULL,                            /* pGetPixelFormat */
diff --git a/dlls/winex11.drv/graphics.c b/dlls/winex11.drv/graphics.c
index e580fd6..5272681 100644
--- a/dlls/winex11.drv/graphics.c
+++ b/dlls/winex11.drv/graphics.c
@@ -25,6 +25,7 @@
 
 #include "config.h"
 
+#include <stdarg.h>
 #include <math.h>
 #ifdef HAVE_FLOAT_H
 # include <float.h>
@@ -35,9 +36,14 @@
 #endif
 #include <string.h>
 
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+
 #include "x11drv.h"
 #include "x11font.h"
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(graphics);
 
@@ -1374,3 +1380,54 @@ DWORD X11DRV_SetDCOrg( X11DRV_PDEVICE *physDev, INT x, INT y )
     physDev->dc_rect.top = y - physDev->drawable_rect.top;
     return ret;
 }
+
+/***********************************************************************
+ *              GetICMProfile (X11DRV.@)
+ */
+BOOL X11DRV_GetICMProfile( X11DRV_PDEVICE *physDev, LPDWORD size, LPWSTR filename )
+{
+    static const WCHAR path[] =
+        {'\\','s','p','o','o','l','\\','d','r','i','v','e','r','s',
+         '\\','c','o','l','o','r','\\',0};
+    static const WCHAR srgb[] =
+        {'s','R','G','B',' ','C','o','l','o','r',' ','S','p','a','c','e',' ',
+         'P','r','o','f','i','l','e','.','i','c','m',0};
+    static const WCHAR mntr[] =
+        {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
+         'W','i','n','d','o','w','s',' ','N','T','\\','C','u','r','r','e','n','t',
+         'V','e','r','s','i','o','n','\\','I','C','M','\\','m','n','t','r',0};
+
+    HKEY hkey;
+    DWORD required;
+    WCHAR profile[MAX_PATH], fullname[MAX_PATH];
+
+    if (!size) return FALSE;
+
+    strcpyW( profile, srgb );
+    if (!RegCreateKeyExW( HKEY_LOCAL_MACHINE, mntr, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkey, NULL ))
+    {
+        DWORD len = sizeof(profile)/sizeof(WCHAR);
+        /* FIXME handle multiple values */
+        RegEnumValueW( hkey, 0, profile, &len, NULL, NULL, NULL, NULL );
+        RegCloseKey( hkey );
+    }
+    GetSystemDirectoryW( fullname, MAX_PATH );
+    strcatW( fullname, path );
+    strcatW( fullname, profile );
+
+    required = strlenW( fullname ) + 1;
+    if (*size < required)
+    {
+        *size = required;
+        SetLastError( ERROR_INSUFFICIENT_BUFFER );
+        return FALSE;
+    }
+    if (filename)
+    {
+        strcpyW( filename, fullname );
+        if (GetFileAttributesW( filename ) == INVALID_FILE_ATTRIBUTES)
+            WARN( "color profile not found\n" );
+    }
+    *size = required;
+    return TRUE;
+}
diff --git a/dlls/winex11.drv/winex11.drv.spec b/dlls/winex11.drv/winex11.drv.spec
index 6c8fe6c..751da52 100644
--- a/dlls/winex11.drv/winex11.drv.spec
+++ b/dlls/winex11.drv/winex11.drv.spec
@@ -22,6 +22,7 @@
 @ cdecl GetDIBits(ptr long long long ptr ptr long) X11DRV_GetDIBits
 @ cdecl GetDeviceCaps(ptr long) X11DRV_GetDeviceCaps
 @ cdecl GetDeviceGammaRamp(ptr ptr) X11DRV_GetDeviceGammaRamp
+@ cdecl GetICMProfile(ptr ptr ptr) X11DRV_GetICMProfile
 @ cdecl GetNearestColor(ptr long) X11DRV_GetNearestColor
 @ cdecl GetPixel(ptr long long) X11DRV_GetPixel
 @ cdecl GetPixelFormat(ptr) X11DRV_GetPixelFormat




More information about the wine-cvs mailing list