mirror of
https://github.com/xcp-ng/xenadmin.git
synced 2024-11-25 14:27:26 +01:00
abf4ae3f35
Signed-off-by: Konstantina Chremmou <konstantina.chremmou@citrix.com>
150 lines
6.8 KiB
C#
150 lines
6.8 KiB
C#
/* Copyright (c) Citrix Systems, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms,
|
|
* with or without modification, are permitted provided
|
|
* that the following conditions are met:
|
|
*
|
|
* * Redistributions of source code must retain the above
|
|
* copyright notice, this list of conditions and the
|
|
* following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above
|
|
* copyright notice, this list of conditions and the
|
|
* following disclaimer in the documentation and/or other
|
|
* materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*/
|
|
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace DotNetVnc
|
|
{
|
|
public class GraphicsUtils
|
|
{
|
|
private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
|
|
|
[DllImport("kernel32.dll")]
|
|
private extern static short QueryPerformanceCounter(ref long x);
|
|
[DllImport("kernel32.dll")]
|
|
private extern static short QueryPerformanceFrequency(ref long x);
|
|
|
|
private static long ctr1 = 0, ctr2 = 0, freq = 0;
|
|
|
|
public static void startTime()
|
|
{
|
|
QueryPerformanceCounter(ref ctr1);
|
|
}
|
|
|
|
public static double endTime(String msg)
|
|
{
|
|
QueryPerformanceCounter(ref ctr2);
|
|
QueryPerformanceFrequency(ref freq);
|
|
double time = (ctr2 - ctr1) * 1.0 / freq;
|
|
Log.Info(msg + " time: " + time + " seconds.");
|
|
ctr1 = ctr2 = freq = 0;
|
|
return time;
|
|
}
|
|
|
|
public static void copyRect(Bitmap src, int x, int y, int width, int height, Graphics dest, int dx, int dy)
|
|
{
|
|
IntPtr pTarget = dest.GetHdc();
|
|
IntPtr pSource = CreateCompatibleDC(pTarget);
|
|
IntPtr pOrig = SelectObject(pSource, src.GetHbitmap());
|
|
BitBlt(pTarget, dx, dy, width, height, pSource, x, y, (uint)TernaryRasterOperations.SRCCOPY);
|
|
IntPtr pNew = SelectObject(pSource, pOrig);
|
|
DeleteObject(pNew);
|
|
DeleteDC(pSource);
|
|
dest.ReleaseHdc(pTarget);
|
|
}
|
|
|
|
[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
|
|
private static extern IntPtr CreateCompatibleDC(IntPtr hdc);
|
|
|
|
[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
|
|
private static extern bool DeleteDC(IntPtr hdc);
|
|
|
|
[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
|
|
private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
|
|
|
|
[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
|
|
private static extern bool DeleteObject(IntPtr hObject);
|
|
|
|
/// <summary>
|
|
/// Performs a bit-block transfer of the color data corresponding to a
|
|
/// rectangle of pixels from the specified source device context into
|
|
/// a destination device context.
|
|
/// </summary>
|
|
/// <param name="hdc">Handle to the destination device context.</param>
|
|
/// <param name="nXDest">The leftmost x-coordinate of the destination rectangle (in pixels).</param>
|
|
/// <param name="nYDest">The topmost y-coordinate of the destination rectangle (in pixels).</param>
|
|
/// <param name="nWidth">The width of the source and destination rectangles (in pixels).</param>
|
|
/// <param name="nHeight">The height of the source and the destination rectangles (in pixels).</param>
|
|
/// <param name="hdcSrc">Handle to the source device context.</param>
|
|
/// <param name="nXSrc">The leftmost x-coordinate of the source rectangle (in pixels).</param>
|
|
/// <param name="nYSrc">The topmost y-coordinate of the source rectangle (in pixels).</param>
|
|
/// <param name="dwRop">A raster-operation code.</param>
|
|
/// <returns>
|
|
/// <c>true</c> if the operation succeeded, <c>false</c> otherwise.
|
|
/// </returns>
|
|
[DllImport("gdi32.dll")]
|
|
private static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth,
|
|
int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);
|
|
|
|
/// <summary>
|
|
/// Specifies a raster-operation code. These codes define how the color data for the
|
|
/// source rectangle is to be combined with the color data for the destination
|
|
/// rectangle to achieve the final color.
|
|
/// </summary>
|
|
private enum TernaryRasterOperations : uint
|
|
{
|
|
/// <summary>dest = source</summary>
|
|
SRCCOPY = 0x00CC0020,
|
|
/// <summary>dest = source OR dest</summary>
|
|
SRCPAINT = 0x00EE0086,
|
|
/// <summary>dest = source AND dest</summary>
|
|
SRCAND = 0x008800C6,
|
|
/// <summary>dest = source XOR dest</summary>
|
|
SRCINVERT = 0x00660046,
|
|
/// <summary>dest = source AND (NOT dest)</summary>
|
|
SRCERASE = 0x00440328,
|
|
/// <summary>dest = (NOT source)</summary>
|
|
NOTSRCCOPY = 0x00330008,
|
|
/// <summary>dest = (NOT src) AND (NOT dest)</summary>
|
|
NOTSRCERASE = 0x001100A6,
|
|
/// <summary>dest = (source AND pattern)</summary>
|
|
MERGECOPY = 0x00C000CA,
|
|
/// <summary>dest = (NOT source) OR dest</summary>
|
|
MERGEPAINT = 0x00BB0226,
|
|
/// <summary>dest = pattern</summary>
|
|
PATCOPY = 0x00F00021,
|
|
/// <summary>dest = DPSnoo</summary>
|
|
PATPAINT = 0x00FB0A09,
|
|
/// <summary>dest = pattern XOR dest</summary>
|
|
PATINVERT = 0x005A0049,
|
|
/// <summary>dest = (NOT dest)</summary>
|
|
DSTINVERT = 0x00550009,
|
|
/// <summary>dest = BLACK</summary>
|
|
BLACKNESS = 0x00000042,
|
|
/// <summary>dest = WHITE</summary>
|
|
WHITENESS = 0x00FF0062
|
|
}
|
|
|
|
}
|
|
}
|