Sub Blend(PosX As Int32, PosY As Int32)
GetDrawingDimensions(PosX, PosY)
Data = New BitmapData
CanvasData = New BitmapData
Select Case True
Case Me.X < 0 AndAlso Me.Y < 0
Bounds = New Rectangle(Math.Abs(Me.X), Math.Abs(Me.Y), WidthToDraw, HeightToDraw)
CanvasBounds = New Rectangle(PosX, PosY, WidthToDraw, HeightToDraw)
Case Me.X < 0
Bounds = New Rectangle(Math.Abs(Me.X), Y, WidthToDraw, HeightToDraw)
CanvasBounds = New Rectangle(PosX, Y + PosY, WidthToDraw, HeightToDraw)
Case Me.Y < 0
Bounds = New Rectangle(X, Math.Abs(Me.Y), WidthToDraw, HeightToDraw)
CanvasBounds = New Rectangle(X + PosX, PosY, WidthToDraw, HeightToDraw)
Case Else
Bounds = New Rectangle(X, Y, WidthToDraw, HeightToDraw)
CanvasBounds = New Rectangle(X + PosX, Y + PosY, WidthToDraw, HeightToDraw)
End Select
Data = TiledImage.LockBits(Bounds, ImageLockMode.ReadOnly, PixelFormat.Format32bppPArgb)
CanvasData = bmpCanvas.LockBits(CanvasBounds, ImageLockMode.ReadWrite, PixelFormat.Format32bppPArgb)
For y As Int32 = 0 To HeightToDraw - 1
For x As Int32 = 0 To WidthToDraw - 1
C1 = Color.FromArgb(Marshal.ReadInt32(Data.Scan0, (Data.Stride * y) + (4 * x)))
C2 = Color.FromArgb(Marshal.ReadInt32(CanvasData.Scan0, (CanvasData.Stride * (y + Me.Y)) + (4 * (x + Me.X))))
If Not C1.ToArgb = Alpha.ToArgb Then
R1 = wA * (C1.R / 8) : G1 = wA * (C1.G / 8) : B1 = wA * (C1.B / 8)
R2 = wB * (C2.R / 8) : G2 = wB * (C2.G / 8) : B2 = wB * (C2.B / 8)
R = Math.Min(31, Math.Floor(R1 + R2)) * 8
G = Math.Min(31, Math.Floor(G1 + G2)) * 8
B = Math.Min(31, Math.Floor(B1 + B2)) * 8
Try
Marshal.WriteByte(CanvasData.Scan0, (CanvasData.Stride * (y + Me.Y)) + (4 * (x + Me.X)), CByte(B))
Marshal.WriteByte(CanvasData.Scan0, (CanvasData.Stride * (y + Me.Y)) + (4 * (x + Me.X)) + 1, CByte(G))
Marshal.WriteByte(CanvasData.Scan0, (CanvasData.Stride * (y + Me.Y)) + (4 * (x + Me.X)) + 2, CByte(R))
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End If
Next
blendProgress.PerformStep(WidthToDraw)
Next
TiledImage.UnlockBits(Data)
bmpCanvas.UnlockBits(CanvasData)
End Sub