mirror of
https://github.com/xcp-ng/xenadmin.git
synced 2024-11-25 14:27:26 +01:00
88fa402e21
Since the standalone VNC control was removed, the VNC code has been used only by the UI project. According to Microsoft's performance guidelines large single assemblies are preferable to multiple smaller ones. Signed-off-by: Konstantina Chremmou <konstantina.chremmou@citrix.com>
152 lines
6.8 KiB
C#
152 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.Collections.Generic;
|
|
using System.Text;
|
|
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
|
|
}
|
|
|
|
}
|
|
}
|