[Mac] Fixed cursor byte order

This commit is contained in:
thefiddler 2014-04-30 09:06:18 +02:00
parent 2632661d8a
commit e63970e2be
4 changed files with 58 additions and 11 deletions

View file

@ -796,6 +796,7 @@
</Compile> </Compile>
<Compile Include="Platform\MacOS\Carbon\Cgl.cs" /> <Compile Include="Platform\MacOS\Carbon\Cgl.cs" />
<Compile Include="WindowIcon.cs" /> <Compile Include="WindowIcon.cs" />
<Compile Include="Platform\MacOS\Cocoa\NSBitmapFormat.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<PropertyGroup> <PropertyGroup>

View file

@ -76,7 +76,7 @@ namespace OpenTK.Platform.MacOS
public extern static IntPtr SendIntPtr(IntPtr receiver, IntPtr selector, RectangleF rectangle1, int int1, IntPtr intPtr1, IntPtr intPtr2); public extern static IntPtr SendIntPtr(IntPtr receiver, IntPtr selector, RectangleF rectangle1, int int1, IntPtr intPtr1, IntPtr intPtr2);
[DllImport(LibObjC, EntryPoint="objc_msgSend")] [DllImport(LibObjC, EntryPoint="objc_msgSend")]
public extern static IntPtr SendIntPtr(IntPtr receiver, IntPtr selector, IntPtr p1, int p2, int p3, int p4, int p5, int p6, int p7, IntPtr p8, int p9, int p10); public extern static IntPtr SendIntPtr(IntPtr receiver, IntPtr selector, IntPtr p1, int p2, int p3, int p4, int p5, int p6, int p7, IntPtr p8, NSBitmapFormat p9, int p10, int p11);
[DllImport(LibObjC, EntryPoint="objc_msgSend")] [DllImport(LibObjC, EntryPoint="objc_msgSend")]
public extern static bool SendBool(IntPtr receiver, IntPtr selector); public extern static bool SendBool(IntPtr receiver, IntPtr selector);

View file

@ -0,0 +1,42 @@
#region License
//
// NSBitmapFormat.cs
//
// Author:
// Stefanos A. <stapostol@gmail.com>
//
// Copyright (c) 2006-2014 Stefanos Apostolopoulos
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#endregion
using System;
namespace OpenTK.Platform.MacOS
{
[Flags]
enum NSBitmapFormat
{
AlphaFirst = 1 << 0,
AlphaNonpremultiplied = 1 << 1,
FloatingPointSamples = 1 << 2
}
}

View file

@ -117,7 +117,7 @@ namespace OpenTK.Platform.MacOS
static readonly IntPtr selAddCursorRect = Selector.Get("addCursorRect:cursor:"); static readonly IntPtr selAddCursorRect = Selector.Get("addCursorRect:cursor:");
static readonly IntPtr selInvalidateCursorRectsForView = Selector.Get("invalidateCursorRectsForView:"); static readonly IntPtr selInvalidateCursorRectsForView = Selector.Get("invalidateCursorRectsForView:");
static readonly IntPtr selInitWithBitmapDataPlanes = static readonly IntPtr selInitWithBitmapDataPlanes =
Selector.Get("initWithBitmapDataPlanes:pixelsWide:pixelsHigh:bitsPerSample:samplesPerPixel:hasAlpha:isPlanar:colorSpaceName:bytesPerRow:bitsPerPixel:"); Selector.Get("initWithBitmapDataPlanes:pixelsWide:pixelsHigh:bitsPerSample:samplesPerPixel:hasAlpha:isPlanar:colorSpaceName:bitmapFormat:bytesPerRow:bitsPerPixel:");
static readonly IntPtr selBitmapData = Selector.Get("bitmapData"); static readonly IntPtr selBitmapData = Selector.Get("bitmapData");
static readonly IntPtr selAddRepresentation = Selector.Get("addRepresentation:"); static readonly IntPtr selAddRepresentation = Selector.Get("addRepresentation:");
static readonly IntPtr selInitWithImageHotSpot = Selector.Get("initWithImage:hotSpot:"); static readonly IntPtr selInitWithImageHotSpot = Selector.Get("initWithImage:hotSpot:");
@ -969,6 +969,7 @@ namespace OpenTK.Platform.MacOS
1, 1,
0, 0,
NSDeviceRGBColorSpace, NSDeviceRGBColorSpace,
NSBitmapFormat.AlphaFirst,
4 * cursor.Width, 4 * cursor.Width,
32), 32),
Selector.Autorelease); Selector.Autorelease);
@ -979,21 +980,24 @@ namespace OpenTK.Platform.MacOS
return IntPtr.Zero; return IntPtr.Zero;
} }
// Premultiply and copy the cursor data // Copy the cursor data
int i = 0; int i = 0;
IntPtr data = Cocoa.SendIntPtr(imgdata, selBitmapData); IntPtr data = Cocoa.SendIntPtr(imgdata, selBitmapData);
for (int y = 0; y < cursor.Height; y++) for (int y = 0; y < cursor.Height; y++)
{ {
for (int x = 0; x < cursor.Width; x++) for (int x = 0; x < cursor.Width; x++)
{ {
byte a = cursor.Argb[i]; uint argb = unchecked((uint)BitConverter.ToInt32(cursor.Argb, i));
byte r = (byte)((cursor.Argb[i + 1] * a) / 255); if (BitConverter.IsLittleEndian)
byte g = (byte)((cursor.Argb[i + 2] * a) / 255); {
byte b = (byte)((cursor.Argb[i + 3] * a) / 255); argb =
Marshal.WriteByte(data, i++, a); (argb & 0x000000FFu) << 24 |
Marshal.WriteByte(data, i++, r); (argb & 0x0000FF00u) << 8 |
Marshal.WriteByte(data, i++, g); (argb & 0x00FF0000u) >> 8 |
Marshal.WriteByte(data, i++, b); (argb & 0xFF000000u) >> 24;
}
Marshal.WriteInt32(data, i, unchecked((int)argb));
i += 4;
} }
} }