Ken Thomases : winemac: Implement GetDeviceGammaRamp() and SetDeviceGammaRamp().
Alexandre Julliard
julliard at winehq.org
Tue Mar 26 15:11:11 CDT 2013
Module: wine
Branch: master
Commit: e633f79f610516e78f7958b2946cb96bac327fe5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e633f79f610516e78f7958b2946cb96bac327fe5
Author: Ken Thomases <ken at codeweavers.com>
Date: Sun Mar 17 22:41:07 2013 -0500
winemac: Implement GetDeviceGammaRamp() and SetDeviceGammaRamp().
---
dlls/winemac.drv/display.c | 131 ++++++++++++++++++++++++++++++++++++++++++++
dlls/winemac.drv/gdi.c | 4 +-
dlls/winemac.drv/macdrv.h | 2 +
3 files changed, 135 insertions(+), 2 deletions(-)
diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c
index f152cc8..85c903d 100644
--- a/dlls/winemac.drv/display.c
+++ b/dlls/winemac.drv/display.c
@@ -24,6 +24,7 @@
#include "macdrv.h"
#include "winuser.h"
#include "winreg.h"
+#include "ddrawi.h"
WINE_DEFAULT_DEBUG_CHANNEL(display);
@@ -599,6 +600,91 @@ failed:
/***********************************************************************
+ * GetDeviceGammaRamp (MACDRV.@)
+ */
+BOOL macdrv_GetDeviceGammaRamp(PHYSDEV dev, LPVOID ramp)
+{
+ BOOL ret = FALSE;
+ DDGAMMARAMP *r = ramp;
+ struct macdrv_display *displays;
+ int num_displays;
+ uint32_t mac_entries;
+ int win_entries = sizeof(r->red) / sizeof(r->red[0]);
+ CGGammaValue *red, *green, *blue;
+ CGError err;
+ int win_entry;
+
+ TRACE("dev %p ramp %p\n", dev, ramp);
+
+ if (macdrv_get_displays(&displays, &num_displays))
+ {
+ WARN("failed to get Mac displays\n");
+ return FALSE;
+ }
+
+ mac_entries = CGDisplayGammaTableCapacity(displays[0].displayID);
+ red = HeapAlloc(GetProcessHeap(), 0, mac_entries * sizeof(red[0]) * 3);
+ if (!red)
+ goto done;
+ green = red + mac_entries;
+ blue = green + mac_entries;
+
+ err = CGGetDisplayTransferByTable(displays[0].displayID, mac_entries, red, green,
+ blue, &mac_entries);
+ if (err != kCGErrorSuccess)
+ {
+ WARN("failed to get Mac gamma table: %d\n", err);
+ goto done;
+ }
+
+ if (mac_entries == win_entries)
+ {
+ for (win_entry = 0; win_entry < win_entries; win_entry++)
+ {
+ r->red[win_entry] = red[win_entry] * 65535 + 0.5;
+ r->green[win_entry] = green[win_entry] * 65535 + 0.5;
+ r->blue[win_entry] = blue[win_entry] * 65535 + 0.5;
+ }
+ }
+ else
+ {
+ for (win_entry = 0; win_entry < win_entries; win_entry++)
+ {
+ double mac_pos = win_entry * (mac_entries - 1) / (double)(win_entries - 1);
+ int mac_entry = mac_pos;
+ double red_value, green_value, blue_value;
+
+ if (mac_entry == mac_entries - 1)
+ {
+ red_value = red[mac_entry];
+ green_value = green[mac_entry];
+ blue_value = blue[mac_entry];
+ }
+ else
+ {
+ double distance = mac_pos - mac_entry;
+
+ red_value = red[mac_entry] * (1 - distance) + red[mac_entry + 1] * distance;
+ green_value = green[mac_entry] * (1 - distance) + green[mac_entry + 1] * distance;
+ blue_value = blue[mac_entry] * (1 - distance) + blue[mac_entry + 1] * distance;
+ }
+
+ r->red[win_entry] = red_value * 65535 + 0.5;
+ r->green[win_entry] = green_value * 65535 + 0.5;
+ r->blue[win_entry] = blue_value * 65535 + 0.5;
+ }
+ }
+
+ ret = TRUE;
+
+done:
+ HeapFree(GetProcessHeap(), 0, red);
+ macdrv_free_displays(displays);
+ return ret;
+}
+
+
+/***********************************************************************
* GetMonitorInfo (MACDRV.@)
*/
BOOL CDECL macdrv_GetMonitorInfo(HMONITOR monitor, LPMONITORINFO info)
@@ -650,6 +736,51 @@ BOOL CDECL macdrv_GetMonitorInfo(HMONITOR monitor, LPMONITORINFO info)
/***********************************************************************
+ * SetDeviceGammaRamp (MACDRV.@)
+ */
+BOOL macdrv_SetDeviceGammaRamp(PHYSDEV dev, LPVOID ramp)
+{
+ DDGAMMARAMP *r = ramp;
+ struct macdrv_display *displays;
+ int num_displays;
+ int win_entries = sizeof(r->red) / sizeof(r->red[0]);
+ CGGammaValue *red, *green, *blue;
+ int i;
+ CGError err = kCGErrorFailure;
+
+ TRACE("dev %p ramp %p\n", dev, ramp);
+
+ if (macdrv_get_displays(&displays, &num_displays))
+ {
+ WARN("failed to get Mac displays\n");
+ return FALSE;
+ }
+
+ red = HeapAlloc(GetProcessHeap(), 0, win_entries * sizeof(red[0]) * 3);
+ if (!red)
+ goto done;
+ green = red + win_entries;
+ blue = green + win_entries;
+
+ for (i = 0; i < win_entries; i++)
+ {
+ red[i] = r->red[i] / 65535.0;
+ green[i] = r->green[i] / 65535.0;
+ blue[i] = r->blue[i] / 65535.0;
+ }
+
+ err = CGSetDisplayTransferByTable(displays[0].displayID, win_entries, red, green, blue);
+ if (err != kCGErrorSuccess)
+ WARN("failed to set display gamma table: %d\n", err);
+
+done:
+ HeapFree(GetProcessHeap(), 0, red);
+ macdrv_free_displays(displays);
+ return (err == kCGErrorSuccess);
+}
+
+
+/***********************************************************************
* macdrv_displays_changed
*
* Handler for DISPLAYS_CHANGED events.
diff --git a/dlls/winemac.drv/gdi.c b/dlls/winemac.drv/gdi.c
index 2a9a019..e05f9ab 100644
--- a/dlls/winemac.drv/gdi.c
+++ b/dlls/winemac.drv/gdi.c
@@ -461,7 +461,7 @@ static const struct gdi_dc_funcs macdrv_funcs =
NULL, /* pGetCharABCWidthsI */
NULL, /* pGetCharWidth */
macdrv_GetDeviceCaps, /* pGetDeviceCaps */
- NULL, /* pGetDeviceGammaRamp */
+ macdrv_GetDeviceGammaRamp, /* pGetDeviceGammaRamp */
NULL, /* pGetFontData */
NULL, /* pGetFontUnicodeRanges */
NULL, /* pGetGlyphIndices */
@@ -522,7 +522,7 @@ static const struct gdi_dc_funcs macdrv_funcs =
NULL, /* pSetDCPenColor */
NULL, /* pSetDIBitsToDevice */
NULL, /* pSetDeviceClipping */
- NULL, /* pSetDeviceGammaRamp */
+ macdrv_SetDeviceGammaRamp, /* pSetDeviceGammaRamp */
NULL, /* pSetLayout */
NULL, /* pSetMapMode */
NULL, /* pSetMapperFlags */
diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h
index d4cbe1d..aeeee2d 100644
--- a/dlls/winemac.drv/macdrv.h
+++ b/dlls/winemac.drv/macdrv.h
@@ -71,6 +71,8 @@ static inline const char *wine_dbgstr_cgrect(CGRect cgrect)
extern CGRect macdrv_get_desktop_rect(void) DECLSPEC_HIDDEN;
extern void macdrv_reset_device_metrics(void) DECLSPEC_HIDDEN;
+extern BOOL macdrv_GetDeviceGammaRamp(PHYSDEV dev, LPVOID ramp) DECLSPEC_HIDDEN;
+extern BOOL macdrv_SetDeviceGammaRamp(PHYSDEV dev, LPVOID ramp) DECLSPEC_HIDDEN;
/**************************************************************************
More information about the wine-cvs
mailing list