13 changed files with 418 additions and 10 deletions
@ -0,0 +1,7 @@ |
|||||
|
namespace Avalonia.Platform |
||||
|
{ |
||||
|
public interface IModuleEnvironmentChecker |
||||
|
{ |
||||
|
bool IsCompatible { get; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Platform; |
||||
|
|
||||
|
namespace Avalonia.Direct2D1 |
||||
|
{ |
||||
|
class WindowsVersionChecker : IModuleEnvironmentChecker |
||||
|
{ |
||||
|
//Direct2D backend doesn't work with Win7 anymore
|
||||
|
public bool IsCompatible => Environment.OSVersion.Version >= new Version(6, 2); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,197 @@ |
|||||
|
//
|
||||
|
// System.Drawing.ComIStreamWrapper.cs
|
||||
|
//
|
||||
|
// Author:
|
||||
|
// Kornél Pál <http://www.kornelpal.hu/>
|
||||
|
//
|
||||
|
// Copyright (C) 2005-2008 Kornél Pál
|
||||
|
//
|
||||
|
|
||||
|
//
|
||||
|
// 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.
|
||||
|
//
|
||||
|
|
||||
|
using System; |
||||
|
using System.IO; |
||||
|
using System.Reflection; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using System.Runtime.InteropServices.ComTypes; |
||||
|
using STATSTG = System.Runtime.InteropServices.ComTypes.STATSTG; |
||||
|
|
||||
|
namespace Avalonia.Win32 |
||||
|
{ |
||||
|
// Stream to IStream wrapper for COM interop
|
||||
|
internal sealed class ComIStreamWrapper : IStream |
||||
|
{ |
||||
|
private const int STG_E_INVALIDFUNCTION = unchecked((int)0x80030001); |
||||
|
|
||||
|
private readonly Stream baseStream; |
||||
|
private long position = -1; |
||||
|
|
||||
|
internal ComIStreamWrapper(Stream stream) |
||||
|
{ |
||||
|
baseStream = stream; |
||||
|
} |
||||
|
|
||||
|
private void SetSizeToPosition() |
||||
|
{ |
||||
|
if (position != -1) |
||||
|
{ |
||||
|
if (position > baseStream.Length) |
||||
|
baseStream.SetLength(position); |
||||
|
baseStream.Position = position; |
||||
|
position = -1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public void Read(byte[] pv, int cb, IntPtr pcbRead) |
||||
|
{ |
||||
|
int read = 0; |
||||
|
|
||||
|
if (cb != 0) |
||||
|
{ |
||||
|
SetSizeToPosition(); |
||||
|
read = baseStream.Read(pv, 0, cb); |
||||
|
} |
||||
|
|
||||
|
if (pcbRead != IntPtr.Zero) |
||||
|
Marshal.WriteInt32(pcbRead, read); |
||||
|
} |
||||
|
|
||||
|
public void Write(byte[] pv, int cb, IntPtr pcbWritten) |
||||
|
{ |
||||
|
if (cb != 0) |
||||
|
{ |
||||
|
SetSizeToPosition(); |
||||
|
baseStream.Write(pv, 0, cb); |
||||
|
} |
||||
|
|
||||
|
if (pcbWritten != IntPtr.Zero) |
||||
|
Marshal.WriteInt32(pcbWritten, cb); |
||||
|
} |
||||
|
|
||||
|
public void Seek(long dlibMove, int dwOrigin, IntPtr plibNewPosition) |
||||
|
{ |
||||
|
long length = baseStream.Length; |
||||
|
long newPosition; |
||||
|
|
||||
|
switch ((SeekOrigin)dwOrigin) |
||||
|
{ |
||||
|
case SeekOrigin.Begin: |
||||
|
newPosition = dlibMove; |
||||
|
break; |
||||
|
case SeekOrigin.Current: |
||||
|
if (position == -1) |
||||
|
newPosition = baseStream.Position + dlibMove; |
||||
|
else |
||||
|
newPosition = position + dlibMove; |
||||
|
break; |
||||
|
case SeekOrigin.End: |
||||
|
newPosition = length + dlibMove; |
||||
|
break; |
||||
|
default: |
||||
|
throw new COMException(null, STG_E_INVALIDFUNCTION); |
||||
|
} |
||||
|
|
||||
|
if (newPosition > length) |
||||
|
position = newPosition; |
||||
|
else |
||||
|
{ |
||||
|
baseStream.Position = newPosition; |
||||
|
position = -1; |
||||
|
} |
||||
|
|
||||
|
if (plibNewPosition != IntPtr.Zero) |
||||
|
Marshal.WriteInt64(plibNewPosition, newPosition); |
||||
|
} |
||||
|
|
||||
|
public void SetSize(long libNewSize) |
||||
|
{ |
||||
|
baseStream.SetLength(libNewSize); |
||||
|
} |
||||
|
|
||||
|
public void CopyTo(IStream pstm, long cb, IntPtr pcbRead, IntPtr pcbWritten) |
||||
|
{ |
||||
|
byte[] buffer; |
||||
|
long written = 0; |
||||
|
int read; |
||||
|
int count; |
||||
|
|
||||
|
if (cb != 0) |
||||
|
{ |
||||
|
if (cb < 4096) |
||||
|
count = (int)cb; |
||||
|
else |
||||
|
count = 4096; |
||||
|
buffer = new byte[count]; |
||||
|
SetSizeToPosition(); |
||||
|
while (true) |
||||
|
{ |
||||
|
if ((read = baseStream.Read(buffer, 0, count)) == 0) |
||||
|
break; |
||||
|
pstm.Write(buffer, read, IntPtr.Zero); |
||||
|
written += read; |
||||
|
if (written >= cb) |
||||
|
break; |
||||
|
if (cb - written < 4096) |
||||
|
count = (int)(cb - written); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (pcbRead != IntPtr.Zero) |
||||
|
Marshal.WriteInt64(pcbRead, written); |
||||
|
if (pcbWritten != IntPtr.Zero) |
||||
|
Marshal.WriteInt64(pcbWritten, written); |
||||
|
} |
||||
|
|
||||
|
public void Commit(int grfCommitFlags) |
||||
|
{ |
||||
|
baseStream.Flush(); |
||||
|
SetSizeToPosition(); |
||||
|
} |
||||
|
|
||||
|
public void Revert() |
||||
|
{ |
||||
|
throw new COMException(null, STG_E_INVALIDFUNCTION); |
||||
|
} |
||||
|
|
||||
|
public void LockRegion(long libOffset, long cb, int dwLockType) |
||||
|
{ |
||||
|
throw new COMException(null, STG_E_INVALIDFUNCTION); |
||||
|
} |
||||
|
|
||||
|
public void UnlockRegion(long libOffset, long cb, int dwLockType) |
||||
|
{ |
||||
|
throw new COMException(null, STG_E_INVALIDFUNCTION); |
||||
|
} |
||||
|
|
||||
|
public void Stat(out STATSTG pstatstg, int grfStatFlag) |
||||
|
{ |
||||
|
pstatstg = new STATSTG(); |
||||
|
pstatstg.cbSize = baseStream.Length; |
||||
|
} |
||||
|
|
||||
|
public void Clone(out IStream ppstm) |
||||
|
{ |
||||
|
ppstm = null; |
||||
|
throw new COMException(null, STG_E_INVALIDFUNCTION); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,128 @@ |
|||||
|
//
|
||||
|
// Code copy-pasted from from Mono / System.Drawing.*.cs
|
||||
|
// Original license below:
|
||||
|
//
|
||||
|
// Authors:
|
||||
|
// Alexandre Pigolkine (pigolkine@gmx.de)
|
||||
|
// Jordi Mas (jordi@ximian.com)
|
||||
|
// Sanjay Gupta (gsanjay@novell.com)
|
||||
|
// Ravindra (rkumar@novell.com)
|
||||
|
// Peter Dennis Bartok (pbartok@novell.com)
|
||||
|
// Sebastien Pouliot <sebastien@ximian.com>
|
||||
|
//
|
||||
|
//
|
||||
|
// Copyright (C) 2004, 2007 Novell, Inc (http://www.novell.com)
|
||||
|
//
|
||||
|
// 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.
|
||||
|
//
|
||||
|
|
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using System.Runtime.InteropServices.ComTypes; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Avalonia.Win32 |
||||
|
{ |
||||
|
static class Gdip |
||||
|
{ |
||||
|
public enum Status |
||||
|
{ |
||||
|
Ok = 0, |
||||
|
GenericError = 1, |
||||
|
InvalidParameter = 2, |
||||
|
OutOfMemory = 3, |
||||
|
ObjectBusy = 4, |
||||
|
InsufficientBuffer = 5, |
||||
|
NotImplemented = 6, |
||||
|
Win32Error = 7, |
||||
|
WrongState = 8, |
||||
|
Aborted = 9, |
||||
|
FileNotFound = 10, |
||||
|
ValueOverflow = 11, |
||||
|
AccessDenied = 12, |
||||
|
UnknownImageFormat = 13, |
||||
|
FontFamilyNotFound = 14, |
||||
|
FontStyleNotFound = 15, |
||||
|
NotTrueTypeFont = 16, |
||||
|
UnsupportedGdiplusVersion = 17, |
||||
|
GdiplusNotInitialized = 18, |
||||
|
PropertyNotFound = 19, |
||||
|
PropertyNotSupported = 20, |
||||
|
ProfileNotFound = 21 |
||||
|
} |
||||
|
|
||||
|
[StructLayout(LayoutKind.Sequential)] |
||||
|
internal struct GdiplusStartupInput |
||||
|
{ |
||||
|
// internalted to silent compiler
|
||||
|
internal uint GdiplusVersion; |
||||
|
internal IntPtr DebugEventCallback; |
||||
|
internal int SuppressBackgroundThread; |
||||
|
internal int SuppressExternalCodecs; |
||||
|
|
||||
|
internal static GdiplusStartupInput MakeGdiplusStartupInput() |
||||
|
{ |
||||
|
GdiplusStartupInput result = new GdiplusStartupInput(); |
||||
|
result.GdiplusVersion = 1; |
||||
|
result.DebugEventCallback = IntPtr.Zero; |
||||
|
result.SuppressBackgroundThread = 0; |
||||
|
result.SuppressExternalCodecs = 0; |
||||
|
return result; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
[StructLayout(LayoutKind.Sequential)] |
||||
|
internal struct GdiplusStartupOutput |
||||
|
{ |
||||
|
internal IntPtr NotificationHook; |
||||
|
internal IntPtr NotificationUnhook; |
||||
|
|
||||
|
internal static GdiplusStartupOutput MakeGdiplusStartupOutput() |
||||
|
{ |
||||
|
GdiplusStartupOutput result = new GdiplusStartupOutput(); |
||||
|
result.NotificationHook = result.NotificationUnhook = IntPtr.Zero; |
||||
|
return result; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
[DllImport("gdiplus.dll")] |
||||
|
public static extern Status GdiplusStartup(ref ulong token, ref GdiplusStartupInput input, ref GdiplusStartupOutput output); |
||||
|
|
||||
|
[DllImport("gdiplus.dll", ExactSpelling = true, CharSet = CharSet.Unicode)] |
||||
|
public static extern Status GdipLoadImageFromStream([MarshalAs(UnmanagedType.Interface, MarshalTypeRef = typeof(IStream))] IStream stream, out IntPtr image); |
||||
|
[DllImport("gdiplus.dll")] |
||||
|
public static extern Status GdipCreateHICONFromBitmap(IntPtr bmp, out IntPtr HandleIcon); |
||||
|
|
||||
|
[DllImport("gdiplus.dll")] |
||||
|
internal static extern Status GdipDisposeImage(IntPtr image); |
||||
|
|
||||
|
static Gdip() |
||||
|
{ |
||||
|
ulong token = 0; |
||||
|
var input = GdiplusStartupInput.MakeGdiplusStartupInput(); |
||||
|
var output = GdiplusStartupOutput.MakeGdiplusStartupOutput(); |
||||
|
GdiplusStartup(ref token, ref input, ref output); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue