aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.IDE.UI/App.config
blob: 3c6b718b3b07400d9fea21c22a6ec6d00bcc2ca9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

      <dependentAssembly>
        <assemblyIdentity name="System.Security.Cryptography.Algorithms" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.IO.FileSystem" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.IO.FileSystem.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Security.Cryptography.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.2.1.0" newVersion="1.2.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Console" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Diagnostics.StackTrace" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
RemoteDesktop.Frames; namespace Tango.RemoteDesktop.Comparers { /// <summary> /// Represents a raster <see cref="IBitmapComparer{TFrame}"/> comparer which will compare and return a <see cref="RasterFrame"/> difference. /// </summary> /// <seealso cref="Tango.RemoteDesktop.IBitmapComparer{Tango.RemoteDesktop.Frames.RasterFrame}" /> public class RasterBitmapComparer : IBitmapComparer<RasterFrame> { /// <summary> /// When max number of differences reached, the comparer will immediately return the current difference frame. /// This should enforce the screen capture engine to report 'No Difference Available'. /// </summary> public long? MaxDifferencesThrow { get; set; } /// <summary> /// Creates the difference as <see cref="RasterFrame"/>. /// </summary> /// <param name="previousBitmap">The previous bitmap.</param> /// <param name="currentBitmap">The current bitmap.</param> /// <returns></returns> /// <exception cref="InvalidOperationException"> /// Cannot compare image. They are the same instance /// or /// Cannot compare image of different size. /// </exception> unsafe public BitmapComparerResult<RasterFrame> CreateDifference(Bitmap previousBitmap, Bitmap currentBitmap) { if (previousBitmap == null | currentBitmap == null) throw new InvalidOperationException("Cannot compare image. They are the same instance"); if (previousBitmap.Height != currentBitmap.Height || previousBitmap.Width != currentBitmap.Width) throw new InvalidOperationException("Cannot compare image of different size."); uint count = 0; Color matchColor = Color.Transparent; Bitmap diffImage = currentBitmap.Clone() as Bitmap; int height = previousBitmap.Height; int width = previousBitmap.Width; BitmapData data1 = previousBitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); BitmapData data2 = currentBitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); BitmapData diffData = diffImage.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); byte* data1Ptr = (byte*)data1.Scan0; byte* data2Ptr = (byte*)data2.Scan0; byte* diffPtr = (byte*)diffData.Scan0; byte[] swapColor = new byte[4]; swapColor[0] = matchColor.B; swapColor[1] = matchColor.G; swapColor[2] = matchColor.R; swapColor[3] = matchColor.A; int rowPadding = data1.Stride - (previousBitmap.Width * 4); // iterate over height (rows) for (int i = 0; i < height; i++) { // iterate over width (columns) for (int j = 0; j < width; j++) { int same = 0; byte[] tmp = new byte[4]; // compare pixels and copy new values into temporary array for (int x = 0; x < 4; x++) { tmp[x] = data2Ptr[0]; if (data1Ptr[0] == data2Ptr[0]) { same++; } data1Ptr++; // advance image1 ptr data2Ptr++; // advance image2 ptr } // swap color or add new values for (int x = 0; x < 4; x++) { diffPtr[0] = (same == 4) ? swapColor[x] : tmp[x]; diffPtr++; // advance diff image ptr } if (same != 4) { count++; if (MaxDifferencesThrow != null && count > MaxDifferencesThrow.Value) { previousBitmap.UnlockBits(data1); currentBitmap.UnlockBits(data2); diffImage.UnlockBits(diffData); diffImage.Dispose(); throw new MaxDifferencesReachedException(); } } } // at the end of each column, skip extra padding if (rowPadding > 0) { data1Ptr += rowPadding; data2Ptr += rowPadding; diffPtr += rowPadding; } } previousBitmap.UnlockBits(data1); currentBitmap.UnlockBits(data2); diffImage.UnlockBits(diffData); return new BitmapComparerResult<RasterFrame>() { Frame = new RasterFrame(diffImage), DifferenceCount = count }; } } }