daily pastebin goal
17%
SHARE
TWEET

_GDIPlus_BitmapApplyFilter v0.9.6 build 2017-05-14 beta

UEZ May 14th, 2017 102 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'coded by UEZ build 2017-05-14 beta
  2. 'good source: http://www.codeproject.com/Articles/781213/Fundamentals-of-Image-Processing-behind-the-scenes by Jakub Szymanowski
  3. #Include Once "crt\stdlib.bi"
  4. #Include Once "crt\math.bi"
  5. '#Include Once "win\gdiplus.bi"
  6. '#Include Once "win\winuser.bi"
  7.  
  8.  
  9. #include once "windows.bi"
  10. #ifdef __FB_64BIT__
  11.     #inclib "gdiplus"
  12.     #include once "win/gdiplus-c.bi"
  13. #else
  14.     #include once "win/ddraw.bi"
  15.     #include once "win/gdiplus.bi"
  16.     using gdiplus
  17. #EndIf
  18.  
  19.  
  20. Using GDIPLUS
  21.  
  22. #define CRLF (Chr(13, 10))
  23. Public Const sVersion = "v0.9.6 build 2017-05-14 beta", fPi = ACos(-1), fPiSqr = Sqr(2 * fPi), f2Pi = 2 * fPi, fRad = fPi / 180
  24.  
  25. Type tagPalette
  26.     Flags As UInteger
  27.     Count As UInteger
  28.     ARGB(256) As UInteger
  29. End Type
  30.    
  31. Extern "Windows-MS"
  32.  
  33.  
  34. Declare Function QCompare cdecl (ByVal e1 As Any Ptr, ByVal e2 As Any Ptr) As Integer
  35. Declare Function __DeltaE(iR1 As Long, iG1 As Long, iB1 As Long, iR2 As Long, iG2 As Long, iB2 As Long) As Single
  36. Declare Function _GDIPlus_BitmapGetAverageColorValue(hImage As Any Ptr, bNegRGB As Bool) As ULong
  37. Declare Function _GDIPlus_BitmapCreateBW(hImage As Any Ptr, iThreshold As UShort) As Any Ptr
  38. Declare Function _GDIPlus_BitmapCreateGreyscale(hImage As Any Ptr) As Any Ptr
  39. Declare Function _GDIPlus_BitmapCreateNegative(hImage As Any Ptr) As Any Ptr
  40. Declare Function _GDIPlus_BitmapCreateInverseGreyscale(hImage As Any Ptr, iThreshold As ULong) As Any Ptr
  41. Declare Function _GDIPlus_BitmapCreateInverseBW(hImage As Any Ptr, iThreshold As UByte) As Any Ptr
  42. Declare Function Min3(fR As Single, fG As Single, fB As Single) As Single
  43. Declare Function Max3(fR As Single, fG As Single, fB As Single) As Single
  44. Declare Function FindNearestColor(iColor As UInteger, ByRef tColorPalette As tagPalette Ptr, iColors As ULong) As UInteger
  45. Declare Function PlusTruncate(a As UByte, b As Long) As UByte
  46.  
  47. Declare Function _GDIPlus_BitmapApplyFilter_SymmetricNearestNeighbour(ByVal hImage As Any Ptr, fRadius As Single, bGDI As Bool) As Any Ptr
  48. Declare Function _GDIPlus_BitmapApplyFilter_Jitter(ByVal hImage As Any Ptr, iAmount As ULong, bGDI As Bool) As Any Ptr
  49. Declare Function _GDIPlus_BitmapApplyFilter_Median(ByVal hImage As Any Ptr, fRadius As Single, bGDI As Bool) As Any Ptr
  50. Declare Function _GDIPlus_BitmapApplyFilter_Kuwahara(ByVal hImage As Any Ptr, iSize As ULong, bGDI As Bool) As Any Ptr
  51. Declare Function _GDIPlus_BitmapApplyFilter_Edges(ByVal hImage As Any Ptr, bMode As UByte, bInverse As Bool, bGDI As Bool) As Any Ptr
  52. Declare Function _GDIPlus_BitmapApplyFilter_Pointillism(ByVal hImage As Any Ptr, iRounds As ULong, iSize As ULong, iA As UByte, bBorder As Bool, bGDI As Bool) As Any Ptr
  53. Declare Function _GDIPlus_BitmapApplyFilter_Linellism(ByVal hImage As Any Ptr, iRounds As ULong, iSize As ULong, iA As UByte, iMode As UByte, bBorder As Bool, bGDI As Bool) As Any Ptr
  54. Declare Function _GDIPlus_BitmapApplyFilter_Convolution(ByVal hImage As Any Ptr, fFactor As Single, fBias As Single, iMode As UByte, pMStruct As Any Ptr, iMatrix As UShort, bGDI As Bool) As Any Ptr
  55. Declare Function _GDIPlus_BitmapApplyFilter_Raster(ByVal hImage As Any Ptr, iSizeW As ULong, iSizeH As ULong, fDensity As Single, fBrightness As Single, fBias As Single, iMode As Byte, bGDI As Bool) As Any Ptr
  56. Declare Function _GDIPlus_BitmapApplyFilter_Pixelate(ByVal hImage As Any Ptr, iPixelate As UByte, bGrid As Bool, bGDI As Bool) As Any Ptr
  57. Declare Function _GDIPlus_BitmapApplyFilter_Dilatation(ByVal hImage As Any Ptr, Size As UByte, bGDI As Bool) As Any Ptr
  58. Declare Function _GDIPlus_BitmapApplyFilter_Erosion(ByVal hImage As Any Ptr, Size As UByte, bGDI As Bool) As Any Ptr
  59. Declare Function _GDIPlus_BitmapApplyFilter_OilPainting(ByVal hImage As Any Ptr, iRadius As UByte, fIntensityLevels As Single, bGDI As Bool) As Any Ptr
  60. Declare Function _GDIPlus_BitmapApplyFilter_ColorAccent(ByVal hImage As Any Ptr, iHue As UShort, fRange As Single, bGDI As Bool) As Any Ptr
  61. Declare Function _GDIPlus_BitmapApplyFilter_PenSketch(ByVal hImage As Any Ptr, iThreshold As Single, bGDI As Bool) As Any Ptr
  62. Declare Function _GDIPlus_BitmapApplyFilter_PenSketch2(ByVal hImage As Any Ptr, iThreshold As UByte, bGDI As Bool) As Any Ptr
  63. Declare Function _GDIPlus_BitmapApplyFilter_Cartoon1(ByVal hImage As Any Ptr, iRadius As UByte, fIntensityLevels As Single, iThreshold As UByte, bGDI As Bool) As Any Ptr
  64. Declare Function _GDIPlus_BitmapApplyFilter_TiltShift(ByVal hImage As Any Ptr, fPosY_Start As Single, iIntensity As UByte, bGDI As Bool) As Any Ptr
  65. Declare Function _GDIPlus_BitmapApplyFilter_RadialBlur(ByVal hImage As Any Ptr, fPosX As Single, fPosY As Single, fRadius As Single, iIntensity As UByte, bGDI As Bool) As Any Ptr
  66. Declare Function _GDIPlus_BitmapApplyFilter_TimeWarp(ByVal hImage As Any Ptr, fFactor As Single, fMidX As Single, fMidY As Single, bGDI As Bool) As Any Ptr
  67. Declare Function _GDIPlus_BitmapApplyFilter_FishEye(ByVal hImage As Any Ptr, bGDI As Bool) As Any Ptr
  68. Declare Function _GDIPlus_BitmapApplyFilter_Wave(ByVal hImage As Any Ptr, fAmplitudeX As Single, fAmplitudeY As Single, fFrequencyX As Single, fFrequencyY As Single, bGDI As Bool) As Any Ptr
  69. Declare Function _GDIPlus_BitmapApplyFilter_Swirl(ByVal hImage As Any Ptr, fDegree As Single, bGDI As Bool) As Any Ptr
  70. Declare Function _GDIPlus_BitmapApplyFilter_XRay(ByVal hImage As Any Ptr, iBias As Byte, bInvert As Bool, bGDI As Bool) As Any Ptr
  71. Declare Function _GDIPlus_BitmapApplyFilter_Median2(ByVal hImage As Any Ptr, fRadius As Single, bGDI As Bool) As Any Ptr
  72. Declare Function _GDIPlus_BitmapApplyFilter_BWJJNDithering(ByVal hImage As Any Ptr, fErrorMultiplier As Single, iThreshold As UByte, bGDI As Bool) As Any Ptr
  73. Declare Function _GDIPlus_BitmapApplyFilter_Indexed(ByVal hImage As Any Ptr, iColors As ULong, bDither As Bool, iDiv As UByte, errorMode As UByte, bGDI As Bool) As Any Ptr
  74.  
  75.  
  76. Sub Ver() Export
  77.     MessageBoxEx(Null,  "_GDIPlus_BitmapApplyFilter.dll" & CRLF & CRLF & _
  78.                                 sVersion & CRLF & CRLF & CRLF & _
  79.                                 "Coded by UEZ" & CRLF & CRLF & CRLF & _
  80.                                 "Credits to:" & CRLF & _
  81.                                 "* Jakub Szymanowski" & CRLF & _
  82.                                 "* rdc" & CRLF & _
  83.                                 "* Dewald Esterhuizen" & CRLF & _
  84.                                 "* Santhosh G_ " & CRLF & _
  85.                                 "* Christian Graus" & CRLF & _
  86.                                 "* www.gutgames.com", _
  87.                                 "DLL Information", MB_ICONINFORMATION OR MB_OK Or MB_APPLMODAL Or MB_TOPMOST, 1033)
  88. End Sub
  89.  
  90.  
  91. 'The qsort function expects three numbers
  92. 'from the compare function:
  93. '-1: if e1 is less than e2
  94. '0: if e1 is equal to e2
  95. '1: if e1 is greater than e2
  96. Private Function QCompare cdecl (ByVal e1 As Any Ptr, ByVal e2 As Any Ptr) As Integer 'code by rdc
  97.     Dim As Integer el1, el2
  98.     Static cnt As Integer
  99.    
  100.     'Get the call count and items passed
  101.     cnt += 1
  102.     'Get the values, must cast to integer ptr
  103.     el1 = *(CPtr(Integer Ptr, e1))
  104.     el2 = *(CPtr(Integer Ptr, e2))
  105.     'Print "Qsort called";cnt;" time(s) with";el1;" and";el2;"."
  106.     'Compare the Values
  107.     If el1 < el2 Then
  108.         Return -1
  109.     ElseIf el1 > el2 Then
  110.         Return 1
  111.     Else
  112.        Return 0
  113.     End If
  114. End Function
  115.  
  116. Private Function __DeltaE(iR1 As Long, iG1 As Long, iB1 As Long, iR2 As Long, iG2 As Long, iB2 As Long) As Single
  117.   Return Sqrt((iR1 - iR2) * (iR1 - iR2) + (iG1 - iG2) * (iG1 - iG2) + (iB1 - iB2) * (iB1 - iB2))
  118. End Function
  119.  
  120. Private Function Min3(fR As Single, fG As Single, fB As Single) As Single
  121.     Dim As Single fSmallest = fR
  122.     If fSmallest > fG Then fSmallest = fG
  123.     If fSmallest > fB Then fSmallest = fB
  124.     Return fSmallest
  125. End Function
  126.  
  127. Private Function Max3(fR As Single, fG As Single, fB As Single) As Single
  128.     Dim As Single fBiggest = fR
  129.     If fBiggest < fG Then fBiggest = fG
  130.     If fBiggest < fB Then fBiggest = fB
  131.     Return fBiggest
  132. End Function
  133.  
  134.  
  135.  
  136. Private Function _GDIPlus_BitmapGetAverageColorValue(hImage As Any Ptr, bNegRGB As Bool) As ULong
  137.     Dim As Single iW, iH
  138.     Dim As BitmapData tBitmapData
  139.     Dim As ULong iX, iY, iRowOffset, c, iCount, iA, iR, iG, iB
  140.     Dim As ULong sumA = 0, sumR = 0, sumG = 0, sumB = 0
  141.    
  142.     GdipGetImageDimension(hImage, @iW, @iH)
  143.    
  144.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  145.     iCount = iW * iH
  146.    
  147.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  148.     For iY = 0 To iH - 1
  149.         iRowOffset = iY * iW
  150.         For iX = 0 To iW - 1
  151.             c = Cast(Integer Ptr, tBitmapData.Scan0)[iRowOffset + iX]
  152.             sumA += (c Shr 24) And &hFF
  153.             sumR += (c Shr 16) And &hFF
  154.             sumG += (c Shr 8) And &hFF
  155.             sumB +=  c And &hFF
  156.         Next
  157.     Next
  158.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  159.  
  160.     If bNegRGB Then
  161.         iA = CLng(sumA / iCount) Shl 24
  162.         iR = (&hFF - CLng(sumR / iCount)) Shl 16
  163.         iG = (&hFF - CLng(sumG / iCount)) Shl 8
  164.         iB = (&hFF - CLng(sumB / iCount))
  165.     Else
  166.         iA = CLng(sumA / iCount) Shl 24
  167.         iR = CLng(sumR / iCount) Shl 16
  168.         iG = CLng(sumG / iCount) Shl 8
  169.         iB = CLng(sumB / iCount)
  170.     EndIf
  171.  
  172.     Return iA + iR + iG + iB
  173. End Function
  174.  
  175. Private Function _GDIPlus_BitmapCreateBW(hImage As Any Ptr, iThreshold As UShort) As Any Ptr
  176.     Dim As Single iW, iH
  177.     Dim As Any Ptr hBitmap_BW
  178.     Dim As BitmapData tBitmapData, tBitmapData_BW
  179.     Dim As Long iX, iY, iRowOffset, iColor, iR, iG, iB
  180.    
  181.     iThreshold = IIf(iThreshold < 0, 0, IIf(iThreshold > 255, 255, iThreshold))
  182.    
  183.     GdipGetImageDimension(hImage, @iW, @iH)
  184.    
  185.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  186.    
  187.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_BW)
  188.     GdipBitmapLockBits(hBitmap_BW, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_BW)
  189.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  190.    
  191.     For iY = 0 To iH - 1
  192.         iRowOffset = iY * iW
  193.         For iX = 0 To iW - 1
  194.           iColor = Cast(Integer Ptr, tBitmapData.Scan0)[iRowOffset + iX]
  195.           iR = (iColor Shr 16) And &hFF
  196.             iG = (iColor Shr 8) And &hFF
  197.             iB = iColor And &hFF
  198.             If Clng((iR + iG + iB) / 3) >= iThreshold Then
  199.             Cast(Integer Ptr, tBitmapData_BW.Scan0)[iRowOffset + iX] = &hFFFFFFFF
  200.             Else
  201.                 Cast(Integer Ptr, tBitmapData_BW.Scan0)[iRowOffset + iX] = &hFF000000
  202.             End If
  203.         Next
  204.     Next
  205.    
  206.     GdipBitmapUnlockBits(hBitmap_BW, @tBitmapData_BW)
  207.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  208.     Return hBitmap_BW  
  209. End Function
  210.  
  211. Private Function _GDIPlus_BitmapCreateGreyscale(hImage As Any Ptr) As Any Ptr
  212.     Dim As Single iW, iH
  213.     Dim As Any Ptr hBitmap_Greyscale
  214.     Dim As BitmapData tBitmapData, tBitmapData_Greyscale
  215.     Dim As Long iX, iY, iRowOffset, iColor, c, iR, iG, iB
  216.    
  217.     GdipGetImageDimension(hImage, @iW, @iH)
  218.    
  219.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  220.    
  221.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Greyscale)
  222.     GdipBitmapLockBits(hBitmap_Greyscale, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Greyscale)
  223.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  224.    
  225.     For iY = 0 To iH - 1
  226.         iRowOffset = iY * iW
  227.         For iX = 0 To iW - 1
  228.           iColor = Cast(Integer Ptr, tBitmapData.Scan0)[iRowOffset + iX]
  229.           iR = (iColor Shr 16) And &hFF
  230.             iG = (iColor Shr 8) And &hFF
  231.             iB = iColor And &hFF
  232.             c = Clng((iR * 213 + iG * 715 + iB * 72) / 1000)
  233.             Cast(Integer Ptr, tBitmapData_Greyscale.Scan0)[iRowOffset + iX] = &hFF000000 + (c Shl 16) + (c Shl 8) + c
  234.         Next
  235.     Next
  236.    
  237.     GdipBitmapUnlockBits(hBitmap_Greyscale, @tBitmapData_Greyscale)
  238.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  239.     Return hBitmap_Greyscale   
  240. End Function
  241.  
  242. Private Function _GDIPlus_BitmapCreateNegative(hImage As Any Ptr) As Any Ptr
  243.     Dim As Single iW, iH
  244.     Dim As Any Ptr hBitmap_Negative
  245.     Dim As BitmapData tBitmapData, tBitmapData_Negative
  246.     Dim As Long iX, iY, iRowOffset
  247.    
  248.     GdipGetImageDimension(hImage, @iW, @iH)
  249.    
  250.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  251.    
  252.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Negative)
  253.     GdipBitmapLockBits(hBitmap_Negative, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Negative)
  254.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  255.    
  256.     For iY = 0 To iH - 1
  257.         iRowOffset = iY * iW
  258.         For iX = 0 To iW - 1
  259.             Cast(Integer Ptr, tBitmapData_Negative.Scan0)[iRowOffset + iX] = Cast(Integer Ptr, tBitmapData.Scan0)[iRowOffset + iX] Xor &h00FFFFFF          
  260.         Next
  261.     Next
  262.    
  263.     GdipBitmapUnlockBits(hBitmap_Negative, @tBitmapData_Negative)
  264.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  265.     Return hBitmap_Negative
  266. End Function
  267.  
  268. Private Function _GDIPlus_BitmapCreateInverseGreyscale(hImage As Any Ptr, iThreshold As ULong) As Any Ptr 'based on original code by Jakub Szymanowski
  269.     Dim As Single iW, iH
  270.     Dim As Any Ptr hBitmap_Inverse
  271.     Dim As BitmapData tBitmapData, tBitmapData_Inverse
  272.     Dim As Long iX, iY, iRowOffset, c, iDistance, iColor, iR, iG, iB
  273.    
  274.     GdipGetImageDimension(hImage, @iW, @iH)
  275.    
  276.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  277.    
  278.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Inverse)
  279.     GdipBitmapLockBits(hBitmap_Inverse, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Inverse)
  280.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  281.    
  282.     For iY = 0 To iH - 1
  283.         iRowOffset = iY * iW
  284.         For iX = 0 To iW - 1
  285.             iColor = Cast(Integer Ptr, tBitmapData.Scan0)[iRowOffset + iX]
  286.             iR = (iColor Shr 16) And &hFF
  287.             iG = (iColor Shr 8) And &hFF
  288.             iB = iColor And &hFF
  289.             c = Clng((iR * 213 + iG * 715 + iB * 72) / 1000)
  290.             iDistance = Abs(iThreshold - c)
  291.             If c >= iThreshold Then iColor = iThreshold - iDistance
  292.             If c < iThreshold Then iColor = iThreshold + iDistance
  293.             c = IIf(c > 255, 255, IIf(c < 0, 0, c))
  294.             Cast(Integer Ptr, tBitmapData_Inverse.Scan0)[iRowOffset + iX] = &hFF000000 + c Shl 16 + c Shl 8 + c    
  295.         Next
  296.     Next
  297.    
  298.     GdipBitmapUnlockBits(hBitmap_Inverse, @tBitmapData_Inverse)
  299.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  300.     Return hBitmap_Inverse     
  301. End Function
  302.  
  303. Private Function _GDIPlus_BitmapCreateInverseBW(hImage As Any Ptr, iThreshold As UByte) As Any Ptr 'based on original code by Jakub Szymanowski
  304.     Dim As Single iW, iH
  305.     Dim As Any Ptr hBitmap_InverseBW
  306.     Dim As BitmapData tBitmapData, tBitmapData_InverseBW
  307.     Dim As Long iX, iY, iRowOffset, c, iColor, iR, iG, iB
  308.    
  309.     GdipGetImageDimension(hImage, @iW, @iH)
  310.    
  311.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  312.    
  313.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_InverseBW)
  314.     GdipBitmapLockBits(hBitmap_InverseBW, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_InverseBW)
  315.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  316.    
  317.    
  318.     iThreshold = IIf(iThreshold < 1, 1, IIf(iThreshold > 254, 254, iThreshold))
  319.    
  320.    
  321.     For iY = 0 To iH - 1
  322.         iRowOffset = iY * iW
  323.         For iX = 0 To iW - 1
  324.             iColor = Cast(Integer Ptr, tBitmapData.Scan0)[iRowOffset + iX]
  325.             iR = (iColor Shr 16) And &hFF
  326.             iG = (iColor Shr 8) And &hFF
  327.             iB = iColor And &hFF
  328.             c = Clng(Clng((iR * 213 + iG * 715 + iB * 72) / 1000))
  329.             If c > iThreshold Then
  330.                 iColor = &hFFFFFFFF
  331.             Else
  332.                 iColor = &hFF000000
  333.             EndIf
  334.             Cast(Integer Ptr, tBitmapData_InverseBW.Scan0)[iRowOffset + iX] = iColor
  335.         Next
  336.     Next
  337.    
  338.     GdipBitmapUnlockBits(hBitmap_InverseBW, @tBitmapData_InverseBW)
  339.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  340.     Return hBitmap_InverseBW       
  341. End Function
  342.  
  343. Private Function _GDIPlus_BitmapCreateSubtract(hImage1 As Any Ptr, hImage2 As Any Ptr, iBias As Byte, bInvert As Bool) As Any Ptr 'based on original code by Dewald Esterhuizen
  344.     Dim As Single iW1, iH1, iW2, iH2
  345.     Dim As Any Ptr hBitmap_Subtract
  346.     Dim As BitmapData tBitmapData1, tBitmapData2, tBitmapData_Subtract
  347.     Dim As Long iX, iY, iRowOffset, iColor1, iColor2, iR, iG, iB
  348.    
  349.     GdipGetImageDimension(hImage1, @iW1, @iH1)
  350.     GdipGetImageDimension(hImage2, @iW2, @iH2)
  351.     If iW1 <> iW2 Or iH1 <> iH2 Then Return 0
  352.    
  353.     Dim As Rect tRect = Type(0, 0, iW1 - 1, iH1 - 1)
  354.    
  355.     GdipCreateBitmapFromScan0(iW1, iH1, 0, PixelFormat32bppARGB, 0, @hBitmap_Subtract)
  356.     GdipBitmapLockBits(hBitmap_Subtract, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Subtract)
  357.     GdipBitmapLockBits(hImage1, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData1)
  358.     GdipBitmapLockBits(hImage2, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData2)
  359.    
  360.    
  361.    
  362.     For iY = 0 To iH1 - 1
  363.         iRowOffset = iY * iW1
  364.         For iX = 0 To iW1 - 1
  365.             iColor1 = Cast(Integer Ptr, tBitmapData1.Scan0)[iRowOffset + iX]
  366.             iColor2 = Cast(Integer Ptr, tBitmapData2.Scan0)[iRowOffset + iX]
  367.             If bInvert Then
  368.                 iR = &hFF - ((iColor1 Shr 16) And &hFF) - ((iColor2 Shr 16) And &hFF) + iBias
  369.                 iG = &hFF - ((iColor1 Shr 8) And &hFF) - ((iColor2 Shr 8) And &hFF) + iBias
  370.                 iB = &hFF - (iColor1 And &hFF) - (iColor2 And &hFF) + iBias
  371.             Else
  372.                 iR = ((iColor1 Shr 16) And &hFF) - ((iColor2 Shr 16) And &hFF) + iBias
  373.                 iG = ((iColor1 Shr 8) And &hFF) - ((iColor2 Shr 8) And &hFF) + iBias
  374.                 iB = (iColor1 And &hFF) - (iColor2 And &hFF) + iBias
  375.             EndIf
  376.             iR = IIf(iR < 0, 0, IIf(iR > 255, 255, iR))
  377.             iG = IIf(iG < 0, 0, IIf(iG > 255, 255, iG))
  378.             iB = IIf(iB < 0, 0, IIf(iB > 255, 255, iB))
  379.             Cast(Integer Ptr, tBitmapData_Subtract.Scan0)[iRowOffset + iX] = &hFF000000 + (iR Shl 16) + (iG Shl 8) + iB
  380.         Next
  381.     Next
  382.    
  383.     GdipBitmapUnlockBits(hBitmap_Subtract, @tBitmapData_Subtract)
  384.     GdipBitmapUnlockBits(hImage1, @tBitmapData1)
  385.     GdipBitmapUnlockBits(hImage2, @tBitmapData2)
  386.     Return hBitmap_Subtract    
  387. End Function
  388.  
  389.  
  390.  
  391. Function _GDIPlus_BitmapApplyFilter_SymmetricNearestNeighbour(ByVal hImage As Any Ptr, fRadius As Single, bGDI As Bool) As Any Ptr Export
  392.     Dim As Single iW, iH
  393.     Dim As Any Ptr hBitmap_Dest, hGDIBitmap
  394.     Dim As BitmapData tBitmapData, tBitmapData_Dest
  395.     Dim As Long iX, iY, iRowOffset, c, k, sumR, sumG, sumB, iCount, xx, yy, iR, iG, iB, iR1, iG1, iB1, iR2, iG2, iB2, x, y
  396.     Dim As Integer iStatus
  397.    
  398.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  399.     If iStatus <> 0 Then Return 0
  400.        
  401.     Dim As Rect tRect_dest = Type(0, 0, iW - 1, iH - 1), tRect = Type(0, 0, iW - 1, iH - 1)
  402.    
  403.     fRadius = IIf(fRadius < 1, 1, IIF(fRadius > 25, 25, fRadius))
  404.    
  405.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Dest)
  406.     GdipBitmapLockBits(hBitmap_Dest, Cast(Any Ptr, @tRect_dest), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Dest)
  407.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  408.    
  409.     For iY = 0 To iH - 1
  410.         iRowOffset = iY * iW
  411.         For iX = 0 To iW - 1
  412.             sumR = 0
  413.             sumG = 0
  414.             sumB = 0
  415.             iCount = 0
  416.             c = Cast(Integer Ptr, tBitmapData.Scan0)[iRowOffset + iX]
  417.             iR = (&h00FF0000 And c) Shr 16
  418.             iG = (&h0000FF00 And c) Shr 8
  419.             iB = &h000000FF And c
  420.             For yy = -fRadius To fRadius
  421.                 For xx = -fRadius To fRadius
  422.                     k = iX + xx
  423.                     x = IIf(k < 0, 0, IIf(k > iW - 1, iW - 1, k))
  424.                     k = iY + yy
  425.                     y = IIf(k < 0, 0, IIf(k > iH - 1, iH - 1, k))
  426.                     c = Cast(Integer Ptr, tBitmapData.Scan0)[y * iW + x]
  427.                     iR1 = (&h00FF0000 And c) Shr 16
  428.                     iG1 = (&h0000FF00 And c) Shr 8
  429.                     iB1 =  &h000000FF And c
  430.                     k = iX - xx
  431.                     x = IIf(k < 0, 0, IIf(k > iW - 1, iW - 1, k))
  432.                     k = iY + yy
  433.                     y = IIf(k < 0, 0, IIf(k > iH - 1, iH - 1, k))
  434.                     c = cast(Integer Ptr, tBitmapData.Scan0)[y * iW + x]
  435.                     iR2 = (&h00FF0000 And c) Shr 16
  436.                     iG2 = (&h0000FF00 And c) Shr 8
  437.                     iB2 =  &h000000FF And c
  438.                     If __DeltaE(iR, iG, iB, iR1, iG1, iB1) < __DeltaE(iR, iG, iB, iR2, iG2, iB2) Then
  439.                         sumR += iR1
  440.                         sumG += iG1
  441.                         sumB += iB1
  442.                     Else
  443.                         sumR += iR2
  444.                         sumG += iG2
  445.                         sumB += iB2                
  446.                     EndIf
  447.                     iCount += 1
  448.                 Next
  449.             Next
  450.             Cast(Integer Ptr, tBitmapData_Dest.Scan0)[iRowOffset + iX] = &hFF000000 + Int(sumR / iCount) * &h10000 + Int(sumG / iCount) * &h100 + Int(sumB / iCount)
  451.         Next
  452.     Next
  453.    
  454.     GdipBitmapUnlockBits(hBitmap_Dest, @tBitmapData_Dest)
  455.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  456.     If bGDI Then
  457.         GdipCreateHBITMAPFromBitmap(hBitmap_Dest, @hGDIBitmap, &hFF000000)
  458.         GdipDisposeImage(hBitmap_Dest)
  459.         Return hGDIBitmap
  460.     EndIf
  461.     Return hBitmap_Dest
  462. End Function
  463.  
  464. Function _GDIPlus_BitmapApplyFilter_Jitter(ByVal hImage As Any Ptr, iAmount As ULong, bGDI As Bool) As Any Ptr Export
  465.     Dim As Single iW, iH
  466.     Dim As Any Ptr hBitmap_Dest, hGDIBitmap
  467.     Dim As BitmapData tBitmapData, tBitmapData_Dest
  468.     Dim As Long iX, iY, iRowOffset, fNX, fNY, iColor
  469.     Dim As Integer iStatus
  470.  
  471.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  472.     If iStatus <> 0 Then Return 0
  473.    
  474.     Dim As Rect tRect_dest = Type(0, 0, iW - 1, iH - 1), tRect = Type(0, 0, iW - 1, iH - 1)
  475.    
  476.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Dest)
  477.     GdipBitmapLockBits(hBitmap_Dest, Cast(Any Ptr, @tRect_dest), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Dest)
  478.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  479.    
  480.     iAmount = IIF(iAmount < 1, 1, iAmount)
  481.    
  482.     For iY = 0 To iH - 1
  483.         iRowOffset = iY * iW
  484.         For iX = 0 To iW - 1
  485.             fNX = iX + Int((Rnd - 0.5) * iAmount)
  486.             fNX = IIf(fNX < 1, 1, IIf(fNX > iW - 1, iW - 1, fNX))
  487.             fNY = (iY + Int((Rnd - 0.5) * iAmount))
  488.             fNY = IIf(fNY < 1, 1, IIf(fNY > iH - 1, iH - 1, fNY))
  489.             fNY *= iW
  490.           iColor = Cast(Integer Ptr, tBitmapData.Scan0)[fNY + fNX]
  491.           Cast(Integer Ptr, tBitmapData_Dest.Scan0)[iRowOffset + iX] = iColor
  492.         Next
  493.     Next
  494.    
  495.     GdipBitmapUnlockBits(hBitmap_Dest, @tBitmapData_Dest)
  496.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  497.     If bGDI Then
  498.         GdipCreateHBITMAPFromBitmap(hBitmap_Dest, @hGDIBitmap, &hFF000000)
  499.         GdipDisposeImage(hBitmap_Dest)
  500.         Return hGDIBitmap
  501.     EndIf
  502.     Return hBitmap_Dest    
  503. End Function
  504.  
  505. Function _GDIPlus_BitmapApplyFilter_Median(ByVal hImage As Any Ptr, fRadius As Single, bGDI As Bool) As Any Ptr Export
  506.     Dim As Single iW, iH
  507.     Dim As Any Ptr hBitmap_Median, hGDIBitmap
  508.     Dim As BitmapData tBitmapData, tBitmapData_Median
  509.     Dim As Integer iX, iY, iRowOffset, iColor, iXX, iYY, iColors, iSize, iOff, iMid, iMedianR, iMedianG, iMedianB, iSizeArray
  510.     Dim As Integer iStatus
  511.  
  512.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  513.     If iStatus <> 0 Then Return 0
  514.    
  515.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  516.    
  517.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Median)
  518.     GdipBitmapLockBits(hBitmap_Median, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Median)
  519.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  520.    
  521.     fRadius = Int(IIf(fRadius < 1, 1, IIF(fRadius > 25, 25, fRadius)))
  522.    
  523.     iSizeArray = (2 * fRadius + 1) * (2 * fRadius + 1)
  524.     ReDim aColorsR(0 To iSizeArray) As Integer
  525.     ReDim aColorsG(0 To iSizeArray) As Integer
  526.     ReDim aColorsB(0 To iSizeArray) As Integer
  527.    
  528.     iSize = iW * iH - 1
  529.    
  530.     For iY = 0 To iH - 1
  531.         iRowOffset = iY * iW
  532.         For iX = 0 To iW - 1
  533.            
  534.             'calculate median Values
  535.           iColors = 0
  536.             For iXX = iX - fRadius To iX + fRadius
  537.                 For iYY = iY - fRadius To iY + fRadius
  538.                     iOff = iYY * iW + iXX
  539.                     iColor = Cast(Integer Ptr, tBitmapData.Scan0)[IIf(iOff < 0, 0, IIf(iOff > iSize, iSize, iOff))]
  540.                     aColorsR(iColors) = (iColor Shr 16) And &hFF
  541.                     aColorsG(iColors) = (iColor Shr 8) And &hFF
  542.                     aColorsB(iColors) = iColor And &hFF
  543.                     iColors += 1
  544.                 Next
  545.             Next  
  546.                    
  547.             'sort array
  548.             qsort @aColorsR(0), iColors, SizeOf(Integer), @QCompare
  549.             qsort @aColorsG(0), iColors, SizeOf(Integer), @QCompare
  550.             qsort @aColorsB(0), iColors, SizeOf(Integer), @QCompare
  551.  
  552.           iMid = Int(iColors / 2)
  553.            
  554.             If (iColors And 1) Then
  555.                 iMedianR = Int(aColorsR(iMid + 1))
  556.                 iMedianG = Int(aColorsG(iMid + 1))
  557.                 iMedianB = Int(aColorsB(iMid + 1))
  558.             Else
  559.                 iMedianR = Int((aColorsR(iMid) + aColorsR(iMid + 1)) / 2)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
  560.                 iMedianG = Int((aColorsG(iMid) + aColorsG(iMid + 1)) / 2)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
  561.                 iMedianB = Int((aColorsB(iMid) + aColorsB(iMid + 1)) / 2)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
  562.             EndIf
  563.            
  564.             'write median color values to bitmap
  565.            Cast(Integer Ptr, tBitmapData_Median.Scan0)[iRowOffset + iX] = &hFF000000 + iMedianR Shl 16 + iMedianG Shl 8 + iMedianB
  566.         Next
  567.     Next
  568.    
  569.     GdipBitmapUnlockBits(hBitmap_Median, @tBitmapData_Median)
  570.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  571.     If bGDI Then
  572.         GdipCreateHBITMAPFromBitmap(hBitmap_Median, @hGDIBitmap, &hFF000000)
  573.         GdipDisposeImage(hBitmap_Median)
  574.         Return hGDIBitmap
  575.     EndIf
  576.     Return hBitmap_Median  
  577. End Function
  578.  
  579. Function _GDIPlus_BitmapApplyFilter_Median2(ByVal hImage As Any Ptr, fRadius As Single, bGDI As Bool) As Any Ptr Export 'based on original code by Dewald Esterhuizen
  580.     Dim As Single iW, iH
  581.     Dim As Any Ptr hBitmap_Median2, hGDIBitmap
  582.     Dim As BitmapData tBitmapData, tBitmapData_Median2
  583.     Dim As Integer iX, iY, iRowOffset, iColor, iXX, iYY, iColors, iSize, iOff, iMid, iMedian, iSizeArray, filterOffset
  584.     Dim As Integer iStatus
  585.  
  586.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  587.     If iStatus <> 0 Then Return 0
  588.    
  589.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  590.    
  591.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Median2)
  592.     GdipBitmapLockBits(hBitmap_Median2, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Median2)
  593.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  594.    
  595.     fRadius = Int(IIf(fRadius < 1, 1, IIF(fRadius > 25, 25, fRadius)))
  596.    
  597.     iSizeArray = (2 * fRadius + 1) * (2 * fRadius + 1)
  598.     ReDim aColors(0 To iSizeArray) As Integer
  599.    
  600.     iSize = iW * iH - 1
  601.     filterOffset = (fRadius - 1) / 2
  602.    
  603.     For iY = 0 To iH - 1
  604.         iRowOffset = iY * iW
  605.         For iX = 0 To iW - 1
  606.            
  607.             'calculate median Values
  608.           iColors = 0
  609.             For iXX = iX - filterOffset To iX + filterOffset
  610.                 For iYY = iY - filterOffset To iY + filterOffset
  611.                     iOff = iYY * iW + iXX
  612.                     iColor = Cast(Integer Ptr, tBitmapData.Scan0)[IIf(iOff < 0, 0, IIf(iOff > iSize, iSize, iOff))]
  613.                     aColors(iColors) = iColor
  614.                     iColors += 1
  615.                 Next
  616.             Next  
  617.                    
  618.             'sort array
  619.             qsort @aColors(0), iColors, SizeOf(Integer), @QCompare
  620.            
  621.             iMedian = Int(aColors(filterOffset))
  622.            
  623.             'write median color values to bitmap
  624.            Cast(Integer Ptr, tBitmapData_Median2.Scan0)[iRowOffset + iX] = iMedian
  625.         Next
  626.     Next
  627.    
  628.     GdipBitmapUnlockBits(hBitmap_Median2, @tBitmapData_Median2)
  629.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  630.     If bGDI Then
  631.         GdipCreateHBITMAPFromBitmap(hBitmap_Median2, @hGDIBitmap, &hFF000000)
  632.         GdipDisposeImage(hBitmap_Median2)
  633.         Return hGDIBitmap
  634.     EndIf
  635.     Return hBitmap_Median2
  636. End Function
  637.  
  638. Function _GDIPlus_BitmapApplyFilter_Kuwahara(ByVal hImage As Any Ptr, iSize As ULong, bGDI As Bool) As Any Ptr Export 'based on code on http://www.gutgames.com/post/Kuwahara-Filter-in-C.aspx
  639.     Dim As Single ApetureMinX(0 To 3), ApetureMaxX(0 To 3), ApetureMinY(0 To 3), ApetureMaxY(0 To 3)
  640.     Dim As Long RValues(0 To 3), GValues(0 To 3), BValues(0 To 3), NumPixels(0 To 3), MaxRValue(0 To 3), MaxGValue(0 To 3), MaxBValue(0 To 3), _
  641.              MinRValue(0 To 3), MinGValue(0 To 3), MinBValue(0 To 3)
  642.     Dim As Long iX, iY, TempX, TempY, x2, y2, i, j, MinDifference, CurrentDifference
  643.     Dim As Long TempColor, r, g, b
  644.     Dim As Any Ptr hBitmap_Kuwahara, hGDIBitmap
  645.     Dim As BitmapData tBitmapData, tBitmapData_Kuwahara
  646.     Dim As Single iW, iH
  647.     Dim As Integer iStatus
  648.  
  649.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  650.     If iStatus <> 0 Then Return 0
  651.    
  652.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  653.    
  654.     ApetureMinX(0) = -(iSize / 2)
  655.     ApetureMinX(1) = 0
  656.     ApetureMinX(2) = -(iSize / 2)
  657.     ApetureMinX(3) = 0
  658.    
  659.     ApetureMaxX(0) = 0
  660.     ApetureMaxX(1) = (iSize / 2)
  661.     ApetureMaxX(2) = 0
  662.     ApetureMaxX(3) = (iSize / 2)
  663.    
  664.     ApetureMinY(0) = -(iSize / 2)
  665.     ApetureMinY(1) = -(iSize / 2)
  666.     ApetureMinY(2) = 0
  667.     ApetureMinY(3) = 0
  668.    
  669.     ApetureMaxY(0) = 0
  670.     ApetureMaxY(1) = 0
  671.     ApetureMaxY(2) = (iSize / 2)
  672.     ApetureMaxY(3) = (iSize / 2)
  673.    
  674.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Kuwahara)
  675.    
  676.     GdipBitmapLockBits(hBitmap_Kuwahara, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Kuwahara)
  677.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  678.    
  679.     For iX = 0 To iW - 1
  680.         For iY = 0 To iH - 1
  681.             RValues(0) = 0
  682.             RValues(1) = 0
  683.             RValues(2) = 0
  684.             RValues(3) = 0
  685.            
  686.             GValues(0) = 0
  687.             GValues(1) = 0
  688.             GValues(2) = 0
  689.             GValues(3) = 0
  690.            
  691.             BValues(0) = 0
  692.             BValues(1) = 0
  693.             BValues(2) = 0
  694.             BValues(3) = 0
  695.            
  696.             NumPixels(0) = 0
  697.             NumPixels(1) = 0
  698.             NumPixels(2) = 0
  699.             NumPixels(3) = 0
  700.            
  701.             MaxRValue(0) = 0
  702.             MaxRValue(1) = 0
  703.             MaxRValue(2) = 0
  704.             MaxRValue(3) = 0
  705.            
  706.             MaxGValue(0) = 0
  707.             MaxGValue(1) = 0
  708.             MaxGValue(2) = 0
  709.             MaxGValue(3) = 0
  710.            
  711.             MaxBValue(0) = 0
  712.             MaxBValue(1) = 0
  713.             MaxBValue(2) = 0
  714.             MaxBValue(3) = 0
  715.            
  716.             MinRValue(0) = 255
  717.             MinRValue(1) = 255
  718.             MinRValue(2) = 255
  719.             MinRValue(3) = 255
  720.            
  721.             MinGValue(0) = 255
  722.             MinGValue(1) = 255
  723.             MinGValue(2) = 255
  724.             MinGValue(3) = 255
  725.            
  726.             MinBValue(0) = 255
  727.             MinBValue(1) = 255
  728.             MinBValue(2) = 255
  729.             MinBValue(3) = 255
  730.            
  731.  
  732.             For i = 0 To 3
  733.                 For x2 = ApetureMinX(i) To ApetureMaxX(i)
  734.                     TempX = iX + x2        
  735.                     If (TempX >= 0) And (TempX < iW) Then
  736.                         For y2 = ApetureMinY(i) To ApetureMaxY(i)
  737.                             TempY = iY + y2
  738.                             If (TempY >= 0) And (TempY < iH) Then
  739.                                 TempColor = cast(Integer Ptr, tBitmapData.Scan0)[(TempY * iW) + TempX]
  740.                                 r = (TempColor Shr 16) And &hFF
  741.                                 g = (TempColor Shr 8) And &hFF
  742.                                 b = TempColor And &hFF
  743.                                 RValues(i) += r
  744.                                 GValues(i) += g
  745.                                 BValues(i) += b
  746.                                 If r > MaxRValue(i) Then
  747.                                     MaxRValue(i) = r
  748.                                 ElseIf r <  MinRValue(i) Then
  749.                                     MinRValue(i) = r
  750.                                 End If
  751.                                 If g > MaxGValue(i) Then
  752.                                     MaxGValue(i) = g
  753.                                 ElseIf g < MinGValue(i) Then
  754.                                     MinGValue(i) = g
  755.                                 End If
  756.                                 If b > MaxBValue(i) Then
  757.                                     MaxBValue(i) = b
  758.                                 ElseIf b < MinBValue(i) Then
  759.                                     MinBValue(i) = b
  760.                                 End If
  761.                                 NumPixels(i) += 1
  762.                             End If
  763.                         Next
  764.                     End If                 
  765.                 Next
  766.             Next
  767.            
  768.             j = 0
  769.             MinDifference = 10000
  770.             For i = 0 To 3
  771.                 CurrentDifference = (MaxRValue(i) - MinRValue(i)) + (MaxGValue(i) - MinGValue(i)) + (MaxBValue(i) - MinBValue(i))
  772.                 If (CurrentDifference < MinDifference) And (NumPixels(i) > 0) Then
  773.                     j = i
  774.                     MinDifference = CurrentDifference
  775.                 EndIf
  776.             Next
  777.             r = Int(RValues(j) / NumPixels(j)) Shl 16
  778.             g = Int(GValues(j) / NumPixels(j)) Shl 8
  779.             b = Int(BValues(j) / NumPixels(j))
  780.  
  781.             Cast(Integer Ptr, tBitmapData_Kuwahara.Scan0)[iY * iW + iX] = &hFF000000 + r + g + b
  782.         Next
  783.     Next
  784.  
  785.     GdipBitmapUnlockBits(hBitmap_Kuwahara, @tBitmapData_Kuwahara)
  786.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  787.    
  788.     If bGDI Then
  789.         GdipCreateHBITMAPFromBitmap(hBitmap_Kuwahara, @hGDIBitmap, &hFF000000)
  790.         GdipDisposeImage(hBitmap_Kuwahara)
  791.         Return hGDIBitmap
  792.     EndIf
  793.    
  794.     Return hBitmap_Kuwahara
  795.    
  796. End Function
  797.  
  798. Function _GDIPlus_BitmapApplyFilter_Edges(ByVal hImage As Any Ptr, bMode As UByte, bInverse As Bool, bGDI As Bool) As Any Ptr Export
  799.     Dim As Single iW, iH
  800.     Dim As Any Ptr hBitmap_Dest, hGDIBitmap
  801.     Dim As BitmapData tBitmapData, tBitmapData_Dest
  802.     Dim As Long iX, iY, iRowOffset, c, cL, iR, iG, iB, iRl, iGl, iBl, iDiff, iRGB
  803.     Dim As Single fBrightness, fBrightnessL
  804.     Dim As Integer iStatus
  805.  
  806.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  807.     If iStatus <> 0 Then Return 0
  808.    
  809.     Dim As Rect tRect_dest = Type(0, 0, iW - 1, iH - 1), tRect = Type(0, 0, iW - 1, iH - 1)
  810.    
  811.    
  812.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Dest)
  813.     GdipBitmapLockBits(hBitmap_Dest, Cast(Any Ptr, @tRect_dest), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Dest)
  814.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  815.    
  816.     For iY = 0 To iH - 1
  817.         iRowOffset = iY * iW
  818.         For iX = 1 To iW - 1
  819.             c = cast(Integer Ptr, tBitmapData.Scan0)[iRowOffset + iX]
  820.             iR = (&h00FF0000 And c) Shr 16
  821.             iG = (&h0000FF00 And c) Shr 8
  822.             iB =  &h000000FF And c
  823.             fBrightness = Sqr(0.299 * iR * iR + 0.587 * iG * iG + 0.114 * iB * iB) 'luminance method
  824.            
  825.             cL = cast(Integer Ptr, tBitmapData.Scan0)[iRowOffset + iX - 1]
  826.             iRl = (&h00FF0000 And cL) Shr 16
  827.             iGl = (&h0000FF00 And cL) Shr 8
  828.             iBl =  &h000000FF And cL
  829.             fBrightnessL = Sqr(0.299 * iRl * iRl + 0.587 * iGl * iGl + 0.114 * iBl * iBl) 'luminance method
  830.            
  831.             Select Case bMode
  832.                 Case 0
  833.                     iDiff = Int(Abs(fBrightness - fBrightnessL))           
  834.                 Case Else
  835.                     iDiff = &h80 + Int(Abs(fBrightness - fBrightnessL))
  836.                     iDiff = IIf(iDiff > 255, 255, iDiff)
  837.             End Select
  838.             If bInverse Then
  839.                 iRGB = ((iDiff Shl 16) + (iDiff Shl 8) + iDiff) Xor &h00FFFFFF
  840.             Else
  841.                 iRGB = (iDiff Shl 16) + (iDiff Shl 8) + iDiff
  842.             EndIf
  843.             Cast(Integer Ptr, tBitmapData_Dest.Scan0)[iRowOffset + iX] = (&hFF000000 + iRGB)
  844.         Next
  845.     Next
  846.    
  847.     GdipBitmapUnlockBits(hBitmap_Dest, @tBitmapData_Dest)
  848.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  849.     If bGDI Then
  850.         GdipCreateHBITMAPFromBitmap(hBitmap_Dest, @hGDIBitmap, &hFF000000)
  851.         GdipDisposeImage(hBitmap_Dest)
  852.         Return hGDIBitmap
  853.     EndIf
  854.     Return hBitmap_Dest
  855. End Function
  856.  
  857. Function _GDIPlus_BitmapApplyFilter_Pointillism(ByVal hImage As Any Ptr, iRounds As ULong, iSize As ULong, iA As UByte, bBorder As Bool, bGDI As Bool) As Any Ptr Export
  858.     Dim As Single iW, iH
  859.     Dim As Any Ptr hBitmap_Dest, hGDIBitmap, hBrush, hPen, hGfx
  860.     Dim As Long i, iR, iG, iB, iARGB, iAlpha, iAlpha2
  861.     Dim As Single fX, fY, iSize2
  862.     Dim As Integer iStatus
  863.  
  864.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  865.     If iStatus <> 0 Then Return 0
  866.  
  867.    
  868.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Dest)
  869.     GdipGetImageGraphicsContext(hBitmap_Dest, @hGfx)
  870.     GdipSetSmoothingMode(hGfx, 4)
  871.     GdipSetPixelOffsetMode(hGfx, 4)
  872.    
  873.     If iRounds < 1 Then iRounds = CLng(iW * iH / 12.5)
  874.     iRounds = IIf(iRounds > 1000000, 1000000, iRounds)
  875.  
  876.    
  877.     iSize = IIF(iSize < 1, 1, IIf(iSize > 512, 512, iSize))
  878.  
  879.     iA = IIF(iA < 1, 1, IIf(iA > 255, 255, iA))
  880.     iAlpha = iA Shl 24
  881.     iAlpha2 = (iA Shr 2) Shl 24
  882.    
  883.     GdipCreatePen1(iAlpha2, 1, 2, @hPen)
  884.    
  885.     iSize2 = iSize / 2
  886.    
  887.     For i = 1 To iRounds
  888.         fX = Rnd * (iW - 1)
  889.         fY = Rnd * (iH - 1)
  890.         GdipBitmapGetPixel(hImage, fX, fY, @iARGB)
  891.         GdipCreateSolidFill(iAlpha + (iARGB And &H00FFFFFF), @hBrush)
  892.         GdipFillEllipse(hGfx, hBrush, fX - iSize2, fY - iSize2, iSize, iSize)
  893.         If bBorder Then GdipDrawEllipse(hGfx, hPen, fX - iSize2, fY - iSize2, iSize, iSize)
  894.         GdipDeleteBrush(hBrush)
  895.     Next
  896.    
  897.     GdipDeletePen(hPen)
  898.     GdipDeleteGraphics(hGfx)
  899.     If bGDI Then
  900.         GdipCreateHBITMAPFromBitmap(hBitmap_Dest, @hGDIBitmap, &hFF000000)
  901.         GdipDisposeImage(hBitmap_Dest)
  902.         Return hGDIBitmap
  903.     EndIf
  904.     Return hBitmap_Dest
  905. End Function
  906.  
  907. Function _GDIPlus_BitmapApplyFilter_Linellism(ByVal hImage As Any Ptr, iRounds As ULong, iSize As ULong, iA As UByte, iMode As UByte, bBorder As Bool, bGDI As Bool) As Any Ptr Export
  908.     Dim As Single iW, iH
  909.     Dim As Any Ptr hBitmap_Dest, hGDIBitmap, hBrush, hPen, hGfx
  910.     Dim As Long i, iR, iG, iB, iARGB, iAlpha, iAlpha2
  911.     Dim As Single fX, fY, iSize2, iSize4
  912.     Dim As Integer iStatus
  913.  
  914.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  915.     If iStatus <> 0 Then Return 0
  916.  
  917.    
  918.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Dest)
  919.     GdipGetImageGraphicsContext(hBitmap_Dest, @hGfx)
  920.     GdipSetSmoothingMode(hGfx, 4)
  921.     GdipSetPixelOffsetMode(hGfx, 4)
  922.    
  923.     If iRounds < 1 Then iRounds = CLng(iW * iH / iSize * 2)
  924.    
  925.     iRounds = IIf(iRounds > 1000000, 1000000, iRounds)
  926.     iSize = IIF(iSize < 1, 1, IIf(iSize > 512, 512, iSize))
  927.  
  928.     iA = IIF(iA < 1, 1, IIf(iA > 255, 255, iA))
  929.     iAlpha = iA Shl 24
  930.     iAlpha2 = (iA Shr 2) Shl 24
  931.     iMode = IIF(iMode < 1, 1, IIf(iMode > 3, 3, iMode))
  932.    
  933.     GdipCreatePen1(iAlpha2, 1, 2, @hPen)
  934.    
  935.     iSize2 = iSize / 2
  936.     iSize4 = iSize / 4
  937.    
  938.     For i = 1 To iRounds
  939.         fX = Rnd * (iW - 1)
  940.         fY = Rnd * (iH - 1)
  941.         GdipBitmapGetPixel(hImage, fX, fY, @iARGB)
  942.         GdipCreateSolidFill(iAlpha + (iARGB And &h00FFFFFF), @hBrush)
  943.         Select Case iMode
  944.             Case 1
  945.                 GdipFillRectangle(hGfx, hBrush, fX, fY, iSize, iSize4)
  946.                 If bBorder Then GdipDrawRectangle(hGfx, hPen, fX - iSize2, fY - iSize2, iSize, iSize4)
  947.             Case 2
  948.                 GdipFillRectangle(hGfx, hBrush, fX, fY, iSize4, iSize)
  949.                 If bBorder Then GdipDrawRectangle(hGfx, hPen, fX - iSize2, fY - iSize2, iSize4, iSize)                     
  950.             Case 3
  951.                 Select Case Int(Rnd * 10)
  952.                     Case 0 to 4
  953.                         GdipFillRectangle(hGfx, hBrush, fX, fY, iSize4, iSize)
  954.                         If bBorder Then GdipDrawRectangle(hGfx, hPen, fX, fY, iSize4, iSize)
  955.                     Case Else
  956.                         GdipFillRectangle(hGfx, hBrush, fX - iSize2, fY, iSize, iSize4)
  957.                         If bBorder Then GdipDrawRectangle(hGfx, hPen, fX, fY, iSize, iSize4)
  958.                 End Select
  959.         End Select
  960.        
  961.         GdipDeleteBrush(hBrush)
  962.     Next
  963.    
  964.     GdipDeletePen(hPen)
  965.     GdipDeleteGraphics(hGfx)
  966.     If bGDI Then
  967.         GdipCreateHBITMAPFromBitmap(hBitmap_Dest, @hGDIBitmap, &hFF000000)
  968.         GdipDisposeImage(hBitmap_Dest)
  969.         Return hGDIBitmap
  970.     EndIf
  971.     Return hBitmap_Dest
  972. End Function
  973.  
  974. Function _GDIPlus_BitmapApplyFilter_Convolution(ByVal hImage As Any Ptr, fFactor As Single, fBias As Single, iMode As UByte, pMStruct As Any Ptr, iMatrix As UShort, bGDI As Bool) As Any Ptr Export
  975.     Dim As Single iW, iH, fRedSum, fGreenSum, fBlueSum, fSum, fMatrix, fW, fH, aFilter(), aFilter2(), f
  976.     Dim As Single fRedSumX, fGreenSumX, fBlueSumX, fRedSumY, fGreenSumY, fBlueSumY, fMatrixX, fMatrixY
  977.     Dim As Any Ptr hBitmap_Dest, hGDIBitmap
  978.     Dim As BitmapData tBitmapData, tBitmapData_Dest
  979.     Dim As Long iX, iY, iRowOffset, iColor, iR, iG, iB, filterWidth, filterHeight, filterX, filterY, imageX, imageY
  980.     Dim As ULong iAlpha, iRGB, c
  981.     Dim As Integer iStatus
  982.     Dim As UShort i, j
  983.     Dim As Single Ptr pMatrix = pMStruct
  984.  
  985.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  986.     If iStatus <> 0 Then Return 0
  987.  
  988.    
  989.     Dim As Rect tRect_dest = Type(0, 0, iW - 1, iH - 1), tRect = Type(0, 0, iW - 1, iH - 1)
  990.        
  991.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Dest)
  992.     GdipBitmapLockBits(hBitmap_Dest, Cast(Any Ptr, @tRect_dest), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Dest)
  993.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  994.    
  995.    
  996.     iAlpha = &hFF000000
  997.     iMode = IIF(iMode < 0, 1, IIf(iMode > 31, 31, iMode))
  998.    
  999.     filterWidth = 3
  1000.     filterHeight = 3
  1001.     Select Case iMode
  1002.         Case 0 'manual matrix
  1003.             filterWidth = Sqr(iMatrix)
  1004.             filterHeight = filterWidth
  1005.             If (filterWidth And 1) <> 1 Or filterWidth ^ 2 <> iMatrix Or filterWidth < 3 Then Return 0
  1006.            
  1007.             ReDim aFilter(0 To filterWidth - 1, 0 To filterHeight - 1)
  1008.             j = -1
  1009.             For i = 0 To iMatrix - 1
  1010.                 If i Mod filterWidth = 0 Then j += 1
  1011.                 aFilter(j Mod filterHeight, i Mod filterWidth) = pMatrix[i]
  1012.             Next
  1013.         Case 1 'Emboss
  1014.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1015.             aFilter(0, 0) = 2.0
  1016.             aFilter(0, 1) = 0.0
  1017.             aFilter(0, 2) = 0.0
  1018.             aFilter(1, 0) = 0.0
  1019.             aFilter(1, 1) = -1.0
  1020.             aFilter(1, 2) = 0.0
  1021.             aFilter(2, 0) = 0.0
  1022.             aFilter(2, 1) = 0.0
  1023.             aFilter(2, 2) = -1.0
  1024.         Case 2 'Emboss45Degree Filter
  1025.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1026.             aFilter(0, 0) = -1.0
  1027.             aFilter(0, 1) = -1.0
  1028.             aFilter(0, 2) = 0.0
  1029.             aFilter(1, 0) = -1.0
  1030.             aFilter(1, 1) = 0.0
  1031.             aFilter(1, 2) = 1.0
  1032.             aFilter(2, 0) = 0.0
  1033.             aFilter(2, 1) = 1.0
  1034.             aFilter(2, 2) = 1.0
  1035.         Case 3 'EmbossTopLeftBottomRight Filter
  1036.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1037.             aFilter(0, 0) = -1.0
  1038.             aFilter(0, 1) = 0.0
  1039.             aFilter(0, 2) = 0.0
  1040.             aFilter(1, 0) = 0.0
  1041.             aFilter(1, 1) = 0.0
  1042.             aFilter(1, 2) = 0.0
  1043.             aFilter(2, 0) = 0.0
  1044.             aFilter(2, 1) = 0.0
  1045.             aFilter(2, 2) = 1.0
  1046.         Case 4 'IntenseEmboss Filter
  1047.             filterWidth = 5
  1048.             filterHeight = 5
  1049.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1050.             aFilter(0, 0) = -1.0
  1051.             aFilter(0, 1) = -1.0
  1052.             aFilter(0, 2) = -1.0
  1053.             aFilter(0, 3) = -1.0
  1054.             aFilter(0, 4) = 0.0
  1055.             aFilter(1, 0) = -1.0
  1056.             aFilter(1, 1) = -1.0
  1057.             aFilter(1, 2) = -1.0
  1058.             aFilter(1, 3) = 0.0
  1059.             aFilter(1, 4) = 1.0
  1060.             aFilter(2, 0) = -1.0
  1061.             aFilter(2, 1) = -1.0
  1062.             aFilter(2, 2) = 0.0
  1063.             aFilter(2, 3) = 1.0
  1064.             aFilter(2, 4) = 1.0
  1065.             aFilter(3, 0) = -1.0
  1066.             aFilter(3, 1) = 0.0
  1067.             aFilter(3, 2) = 1.0
  1068.             aFilter(3, 3) = 1.0
  1069.             aFilter(3, 4) = 1.0
  1070.             aFilter(4, 0) = 0.0
  1071.             aFilter(4, 1) = 1.0
  1072.             aFilter(4, 2) = 1.0
  1073.             aFilter(4, 3) = 1.0
  1074.             aFilter(4, 4) = 1.0
  1075.         Case 5 'Sharpen
  1076.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1077.             aFilter(0, 0) = 0
  1078.             aFilter(0, 1) = -1
  1079.             aFilter(0, 2) = 0
  1080.             aFilter(1, 0) = -1
  1081.             aFilter(1, 1) = 5
  1082.             aFilter(1, 2) = -1
  1083.             aFilter(2, 0) = 0
  1084.             aFilter(2, 1) = -1
  1085.             aFilter(2, 2) = 0
  1086.         Case 6 'Box blur (normalized)
  1087.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1088.             aFilter(0, 0) = 1
  1089.             aFilter(0, 1) = 1
  1090.             aFilter(0, 2) = 1
  1091.             aFilter(1, 0) = 1
  1092.             aFilter(1, 1) = 1
  1093.             aFilter(1, 2) = 1
  1094.             aFilter(2, 0) = 1
  1095.             aFilter(2, 1) = 1
  1096.             aFilter(2, 2) = 1
  1097.         Case 7 'Gaussian blur (approximation)
  1098.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1099.             aFilter(0, 0) = 1
  1100.             aFilter(0, 1) = 2
  1101.             aFilter(0, 2) = 1
  1102.             aFilter(1, 0) = 2
  1103.             aFilter(1, 1) = 4
  1104.             aFilter(1, 2) = 2
  1105.             aFilter(2, 0) = 1
  1106.             aFilter(2, 1) = 2
  1107.             aFilter(2, 2) = 1
  1108.         Case 8 'Triangle Blur
  1109.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1110.             aFilter(0, 0) = 1
  1111.             aFilter(0, 1) = 2
  1112.             aFilter(0, 2) = 1
  1113.             aFilter(1, 0) = 2
  1114.             aFilter(1, 1) = 4
  1115.             aFilter(1, 2) = 2
  1116.             aFilter(2, 0) = 1
  1117.             aFilter(2, 1) = 2
  1118.             aFilter(2, 2) = 1
  1119.         Case 9 'Unsharp (with no image mask) 5×5
  1120.             filterWidth = 5
  1121.             filterHeight = 5
  1122.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1123.             aFilter(0, 0) = -1 / 256
  1124.             aFilter(0, 1) = -1 / 256 * 4
  1125.             aFilter(0, 2) = -1 / 256 * 6
  1126.             aFilter(0, 3) = -1 / 256 * 4
  1127.             aFilter(0, 4) = -1 / 256 * 1
  1128.             aFilter(1, 0) = -1 / 256 * 4
  1129.             aFilter(1, 1) = -1 / 256 * 16
  1130.             aFilter(1, 2) = -1 / 256 * 24
  1131.             aFilter(1, 3) = -1 / 256 * 16
  1132.             aFilter(1, 4) = -1 / 256 * 4
  1133.             aFilter(2, 0) = -1 / 256 * 6
  1134.             aFilter(2, 1) = -1 / 256 * 24
  1135.             aFilter(2, 2) = -1 / 256 * -476
  1136.             aFilter(2, 3) = -1 / 256 * 24
  1137.             aFilter(2, 4) = -1 / 256 * 6
  1138.             aFilter(3, 0) = -1 / 256 * 4
  1139.             aFilter(3, 1) = -1 / 256 * 16
  1140.             aFilter(3, 2) = -1 / 256 * 24
  1141.             aFilter(3, 3) = -1 / 256 * 16
  1142.             aFilter(3, 4) = -1 / 256 * 4
  1143.             aFilter(4, 0) = -1 / 256
  1144.             aFilter(4, 1) = -1 / 256 * 4
  1145.             aFilter(4, 2) = -1 / 256 * 6
  1146.             aFilter(4, 3) = -1 / 256 * 4
  1147.             aFilter(4, 4) = -1 / 256
  1148.         Case 10 'Unsharpen
  1149.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1150.             aFilter(0, 0) = -1
  1151.             aFilter(0, 1) = -1
  1152.             aFilter(0, 2) = -1
  1153.             aFilter(1, 0) = -1
  1154.             aFilter(1, 1) = 9
  1155.             aFilter(1, 2) = -1
  1156.             aFilter(2, 0) = -1
  1157.             aFilter(2, 1) = -1
  1158.             aFilter(2, 2) = -1
  1159.         Case 11 'Edge Detection 1
  1160.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1161.             aFilter(0, 0) = -0.125
  1162.             aFilter(0, 1) = -0.125
  1163.             aFilter(0, 2) = -0.125
  1164.             aFilter(1, 0) = -0.125
  1165.             aFilter(1, 1) = 1
  1166.             aFilter(1, 2) = -0.125
  1167.             aFilter(2, 0) = -0.125
  1168.             aFilter(2, 1) = -0.125
  1169.             aFilter(2, 2) = -0.125
  1170.         Case 12 'Edge Detection 2
  1171.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1172.             aFilter(0, 0) = -1
  1173.             aFilter(0, 1) = -1
  1174.             aFilter(0, 2) = -1
  1175.             aFilter(1, 0) = -1
  1176.             aFilter(1, 1) = 8
  1177.             aFilter(1, 2) = -1
  1178.             aFilter(2, 0) = -1
  1179.             aFilter(2, 1) = -1
  1180.             aFilter(2, 2) = -1
  1181.         Case 13 'Edge Detection 3
  1182.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1183.             aFilter(0, 0) = -5
  1184.             aFilter(0, 1) = 0
  1185.             aFilter(0, 2) = 0
  1186.             aFilter(1, 0) = 0
  1187.             aFilter(1, 1) = 0
  1188.             aFilter(1, 2) = 0
  1189.             aFilter(2, 0) = 0
  1190.             aFilter(2, 1) = 0
  1191.             aFilter(2, 2) = 5
  1192.         Case 14 'Edge Detection 4
  1193.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1194.             aFilter(0, 0) = -1
  1195.             aFilter(0, 1) = -1
  1196.             aFilter(0, 2) = -1
  1197.             aFilter(1, 0) = 0
  1198.             aFilter(1, 1) = 0
  1199.             aFilter(1, 2) = 0
  1200.             aFilter(2, 0) = 1
  1201.             aFilter(2, 1) = 1
  1202.             aFilter(2, 2) = 1
  1203.         Case 15 'Edge Detection 5
  1204.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1205.             aFilter(0, 0) = -1
  1206.             aFilter(0, 1) = -1
  1207.             aFilter(0, 2) = -1
  1208.             aFilter(1, 0) = 2
  1209.             aFilter(1, 1) = 2
  1210.             aFilter(1, 2) = 2
  1211.             aFilter(2, 0) = -1
  1212.             aFilter(2, 1) = -1
  1213.             aFilter(2, 2) = -1
  1214.         Case 16 'Edge Detection 6
  1215.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1216.             aFilter(0, 0) = -5
  1217.             aFilter(0, 1) = -5
  1218.             aFilter(0, 2) = -5
  1219.             aFilter(1, 0) = -5
  1220.             aFilter(1, 1) = 39
  1221.             aFilter(1, 2) = -5
  1222.             aFilter(2, 0) = -5
  1223.             aFilter(2, 1) = -5
  1224.             aFilter(2, 2) = -5
  1225.         Case 17 'Another Blur
  1226.             filterWidth = 5
  1227.             filterHeight = 5
  1228.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1229.             aFilter(0, 0) = 0
  1230.             aFilter(0, 1) = 0
  1231.             aFilter(0, 2) = 1
  1232.             aFilter(0, 3) = 0
  1233.             aFilter(0, 4) = 0
  1234.             aFilter(1, 0) = 0
  1235.             aFilter(1, 1) = 1
  1236.             aFilter(1, 2) = 1
  1237.             aFilter(1, 3) = 1
  1238.             aFilter(1, 4) = 0
  1239.             aFilter(2, 0) = 1
  1240.             aFilter(2, 1) = 1
  1241.             aFilter(2, 2) = 1
  1242.             aFilter(2, 3) = 1
  1243.             aFilter(2, 4) = 1
  1244.             aFilter(3, 0) = 0
  1245.             aFilter(3, 1) = 1
  1246.             aFilter(3, 2) = 1
  1247.             aFilter(3, 3) = 1
  1248.             aFilter(3, 4) = 0
  1249.             aFilter(4, 0) = 0
  1250.             aFilter(4, 1) = 0
  1251.             aFilter(4, 2) = 1
  1252.             aFilter(4, 3) = 0
  1253.             aFilter(4, 4) = 0
  1254.         Case 18 'Motion Blur
  1255.             filterWidth = 9
  1256.             filterHeight = 9
  1257.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1258.             aFilter(0, 0) = 1
  1259.             aFilter(0, 1) = 0
  1260.             aFilter(0, 2) = 0
  1261.             aFilter(0, 3) = 0
  1262.             aFilter(0, 4) = 0
  1263.             aFilter(0, 5) = 0
  1264.             aFilter(0, 6) = 0
  1265.             aFilter(0, 7) = 0
  1266.             aFilter(0, 8) = 0
  1267.             aFilter(1, 0) = 0
  1268.             aFilter(1, 1) = 1
  1269.             aFilter(1, 2) = 0
  1270.             aFilter(1, 3) = 0
  1271.             aFilter(1, 4) = 0
  1272.             aFilter(1, 5) = 0
  1273.             aFilter(1, 6) = 0
  1274.             aFilter(1, 7) = 0
  1275.             aFilter(1, 8) = 0
  1276.             aFilter(2, 0) = 0
  1277.             aFilter(2, 1) = 0
  1278.             aFilter(2, 2) = 1
  1279.             aFilter(2, 3) = 0
  1280.             aFilter(2, 4) = 0
  1281.             aFilter(2, 5) = 0
  1282.             aFilter(2, 6) = 0
  1283.             aFilter(2, 7) = 0
  1284.             aFilter(2, 8) = 0      
  1285.             aFilter(3, 0) = 0
  1286.             aFilter(3, 1) = 0
  1287.             aFilter(3, 2) = 0
  1288.             aFilter(3, 3) = 1
  1289.             aFilter(3, 4) = 0
  1290.             aFilter(3, 5) = 0
  1291.             aFilter(3, 6) = 0
  1292.             aFilter(3, 7) = 0
  1293.             aFilter(3, 8) = 0
  1294.             aFilter(4, 0) = 0
  1295.             aFilter(4, 1) = 0
  1296.             aFilter(4, 2) = 0
  1297.             aFilter(4, 3) = 0
  1298.             aFilter(4, 4) = 1
  1299.             aFilter(4, 5) = 0
  1300.             aFilter(4, 6) = 0
  1301.             aFilter(4, 7) = 0
  1302.             aFilter(4, 8) = 0
  1303.             aFilter(5, 0) = 0
  1304.             aFilter(5, 1) = 0
  1305.             aFilter(5, 2) = 0
  1306.             aFilter(5, 3) = 0
  1307.             aFilter(5, 4) = 0
  1308.             aFilter(5, 5) = 1
  1309.             aFilter(5, 6) = 0
  1310.             aFilter(5, 7) = 0
  1311.             aFilter(5, 8) = 0
  1312.             aFilter(6, 0) = 0
  1313.             aFilter(6, 1) = 0
  1314.             aFilter(6, 2) = 0
  1315.             aFilter(6, 3) = 0
  1316.             aFilter(6, 4) = 0
  1317.             aFilter(6, 5) = 0
  1318.             aFilter(6, 6) = 1
  1319.             aFilter(6, 7) = 0
  1320.             aFilter(6, 8) = 0
  1321.             aFilter(7, 0) = 0
  1322.             aFilter(7, 1) = 0
  1323.             aFilter(7, 2) = 0
  1324.             aFilter(7, 3) = 0
  1325.             aFilter(7, 4) = 0
  1326.             aFilter(7, 5) = 0
  1327.             aFilter(7, 6) = 0
  1328.             aFilter(7, 7) = 1
  1329.             aFilter(7, 8) = 0
  1330.             aFilter(8, 0) = 0
  1331.             aFilter(8, 1) = 0
  1332.             aFilter(8, 2) = 0
  1333.             aFilter(8, 3) = 0
  1334.             aFilter(8, 4) = 0
  1335.             aFilter(8, 5) = 0
  1336.             aFilter(8, 6) = 0
  1337.             aFilter(8, 7) = 0
  1338.             aFilter(8, 8) = 1
  1339.         Case 19 'Sharpen 2
  1340.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1341.             aFilter(0, 0) = 1
  1342.             aFilter(0, 1) = 1
  1343.             aFilter(0, 2) = 1
  1344.             aFilter(1, 0) = 1
  1345.             aFilter(1, 1) = -7
  1346.             aFilter(1, 2) = 1
  1347.             aFilter(2, 0) = 1
  1348.             aFilter(2, 1) = 1
  1349.             aFilter(2, 2) = 1
  1350.         Case 20 'Sobel Filter      
  1351.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1352.             ReDim aFilter2(0 To filterHeight - 1, 0 To filterWidth - 1)
  1353.            
  1354.             'horizontal
  1355.             aFilter(0, 0) = 1
  1356.             aFilter(0, 1) = 2
  1357.             aFilter(0, 2) = 1
  1358.             aFilter(1, 0) = 0
  1359.             aFilter(1, 1) = 0
  1360.             aFilter(1, 2) = 0
  1361.             aFilter(2, 0) = -1
  1362.             aFilter(2, 1) = -2
  1363.             aFilter(2, 2) = -1
  1364.            
  1365.             'vertical
  1366.             aFilter2(0, 0) = 1
  1367.             aFilter2(0, 1) = 0
  1368.             aFilter2(0, 2) = -1
  1369.             aFilter2(1, 0) = 2
  1370.             aFilter2(1, 1) = 0
  1371.             aFilter2(1, 2) = -2
  1372.             aFilter2(2, 0) = 1
  1373.             aFilter2(2, 1) = 0
  1374.             aFilter2(2, 2) = -1
  1375.         Case 21 'Laplace filter 3x3 v1
  1376.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1377.             aFilter(0, 0) = 0
  1378.             aFilter(0, 1) = -1
  1379.             aFilter(0, 2) = 0
  1380.             aFilter(1, 0) = -1
  1381.             aFilter(1, 1) = 4
  1382.             aFilter(1, 2) = -1
  1383.             aFilter(2, 0) = 0
  1384.             aFilter(2, 1) = -1
  1385.             aFilter(2, 2) = 0
  1386.         Case 22 'Laplace filter 3x3 v2
  1387.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1388.             aFilter(0, 0) = -1
  1389.             aFilter(0, 1) = -1
  1390.             aFilter(0, 2) = -1
  1391.             aFilter(1, 0) = -1
  1392.             aFilter(1, 1) = 8
  1393.             aFilter(1, 2) = -1
  1394.             aFilter(2, 0) = -1
  1395.             aFilter(2, 1) = -1
  1396.             aFilter(2, 2) = -1
  1397.         Case 23 'Laplace filter 5x5
  1398.             filterWidth = 5
  1399.             filterHeight = 5
  1400.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1401.             aFilter(0, 0) = -1
  1402.             aFilter(0, 1) = -1
  1403.             aFilter(0, 2) = -1
  1404.             aFilter(0, 3) = -1
  1405.             aFilter(0, 4) = -1
  1406.             aFilter(1, 0) = -1
  1407.             aFilter(1, 1) = -1
  1408.             aFilter(1, 2) = -1
  1409.             aFilter(1, 3) = -1
  1410.             aFilter(1, 4) = -1
  1411.             aFilter(2, 0) = -1
  1412.             aFilter(2, 1) = -1
  1413.             aFilter(2, 2) = 24
  1414.             aFilter(2, 3) = -1
  1415.             aFilter(2, 4) = -1
  1416.             aFilter(3, 0) = -1
  1417.             aFilter(3, 1) = -1
  1418.             aFilter(3, 2) = -1
  1419.             aFilter(3, 3) = -1
  1420.             aFilter(3, 4) = -1
  1421.             aFilter(4, 0) = -1
  1422.             aFilter(4, 1) = -1
  1423.             aFilter(4, 2) = -1
  1424.             aFilter(4, 3) = -1
  1425.             aFilter(4, 4) = -1
  1426.         Case 24 'Prewitt
  1427.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1428.             ReDim aFilter2(0 To filterHeight - 1, 0 To filterWidth - 1)
  1429.             'horizontal
  1430.             aFilter(0, 0) = -1
  1431.             aFilter(0, 1) = 0
  1432.             aFilter(0, 2) = 1
  1433.             aFilter(1, 0) = -1
  1434.             aFilter(1, 1) = 0
  1435.             aFilter(1, 2) = 1
  1436.             aFilter(2, 0) = -1
  1437.             aFilter(2, 1) = 0
  1438.             aFilter(2, 2) = 1
  1439.             'vertical
  1440.             aFilter2(0, 0) = 1
  1441.             aFilter2(0, 1) = 1
  1442.             aFilter2(0, 2) = 1
  1443.             aFilter2(1, 0) = 0
  1444.             aFilter2(1, 1) = 0
  1445.             aFilter2(1, 2) = 0
  1446.             aFilter2(2, 0) = -1
  1447.             aFilter2(2, 1) = -1
  1448.             aFilter2(2, 2) = -1
  1449.         Case 25 'Kirsch
  1450.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1451.             ReDim aFilter2(0 To filterHeight - 1, 0 To filterWidth - 1)
  1452.             'horizontal
  1453.             aFilter(0, 0) = 5
  1454.             aFilter(0, 1) = 5
  1455.             aFilter(0, 2) = 5
  1456.             aFilter(1, 0) = -3
  1457.             aFilter(1, 1) = 0
  1458.             aFilter(1, 2) = -3
  1459.             aFilter(2, 0) = -3
  1460.             aFilter(2, 1) = -3
  1461.             aFilter(2, 2) = -3
  1462.             'vertical
  1463.             aFilter2(0, 0) = 5
  1464.             aFilter2(0, 1) = -3
  1465.             aFilter2(0, 2) = -3
  1466.             aFilter2(1, 0) = 4
  1467.             aFilter2(1, 1) = 0
  1468.             aFilter2(1, 2) = -3
  1469.             aFilter2(2, 0) = 5
  1470.             aFilter2(2, 1) = -3
  1471.             aFilter2(2, 2) = -3
  1472.         Case 26 'Outline 3x3
  1473.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1474.             aFilter(0, 0) = -1
  1475.             aFilter(0, 1) = -1
  1476.             aFilter(0, 2) = -1
  1477.             aFilter(1, 0) = -1
  1478.             aFilter(1, 1) = 8
  1479.             aFilter(1, 2) = -1
  1480.             aFilter(2, 0) = -1
  1481.             aFilter(2, 1) = -1
  1482.             aFilter(2, 2) = -1
  1483.         Case 27 'Gaussian5x5 Type1 blur
  1484.             filterWidth = 5
  1485.             filterHeight = 5
  1486.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1487.             aFilter(0, 0) = 2
  1488.             aFilter(0, 1) = 4
  1489.             aFilter(0, 2) = 5
  1490.             aFilter(0, 3) = 4
  1491.             aFilter(0, 4) = 2
  1492.             aFilter(1, 0) = 4
  1493.             aFilter(1, 1) = 9
  1494.             aFilter(1, 2) = 12
  1495.             aFilter(1, 3) = 9
  1496.             aFilter(1, 4) = 4
  1497.             aFilter(2, 0) = 5
  1498.             aFilter(2, 1) = 12
  1499.             aFilter(2, 2) = 15
  1500.             aFilter(2, 3) = 12
  1501.             aFilter(2, 4) = 5
  1502.             aFilter(3, 0) = 4
  1503.             aFilter(3, 1) = 9
  1504.             aFilter(3, 2) = 12
  1505.             aFilter(3, 3) = 9
  1506.             aFilter(3, 4) = 4
  1507.             aFilter(4, 0) = 2
  1508.             aFilter(4, 1) = 4
  1509.             aFilter(4, 2) = 5
  1510.             aFilter(4, 3) = 4
  1511.             aFilter(4, 4) = 2      
  1512.         Case 28 'Gaussian5x5 Type2 blur
  1513.             filterWidth = 5
  1514.             filterHeight = 5
  1515.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1516.             aFilter(0, 0) = 1
  1517.             aFilter(0, 1) = 4
  1518.             aFilter(0, 2) = 6
  1519.             aFilter(0, 3) = 4
  1520.             aFilter(0, 4) = 1
  1521.             aFilter(1, 0) = 4
  1522.             aFilter(1, 1) = 16
  1523.             aFilter(1, 2) = 24
  1524.             aFilter(1, 3) = 16
  1525.             aFilter(1, 4) = 4
  1526.             aFilter(2, 0) = 6
  1527.             aFilter(2, 1) = 24
  1528.             aFilter(2, 2) = 36
  1529.             aFilter(2, 3) = 24
  1530.             aFilter(2, 4) = 6
  1531.             aFilter(3, 0) = 4
  1532.             aFilter(3, 1) = 16
  1533.             aFilter(3, 2) = 24
  1534.             aFilter(3, 3) = 16
  1535.             aFilter(3, 4) = 4
  1536.             aFilter(4, 0) = 1
  1537.             aFilter(4, 1) = 4
  1538.             aFilter(4, 2) = 6
  1539.             aFilter(4, 3) = 4
  1540.             aFilter(4, 4) = 1
  1541.         Case 29 'Laplacian of Gaussian 5x5
  1542.             filterWidth = 5
  1543.             filterHeight = 5
  1544.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1545.             aFilter(0, 0) = 0
  1546.             aFilter(0, 1) = 0
  1547.             aFilter(0, 2) = -1
  1548.             aFilter(0, 3) = 0
  1549.             aFilter(0, 4) = 0
  1550.             aFilter(1, 0) = 0
  1551.             aFilter(1, 1) = -1
  1552.             aFilter(1, 2) = -2
  1553.             aFilter(1, 3) = -1
  1554.             aFilter(1, 4) = 0
  1555.             aFilter(2, 0) = -1
  1556.             aFilter(2, 1) = -2
  1557.             aFilter(2, 2) = 16
  1558.             aFilter(2, 3) = -2
  1559.             aFilter(2, 4) = -1
  1560.             aFilter(3, 0) = 0
  1561.             aFilter(3, 1) = -1
  1562.             aFilter(3, 2) = -2
  1563.             aFilter(3, 3) = -1
  1564.             aFilter(3, 4) = 0
  1565.             aFilter(4, 0) = 0
  1566.             aFilter(4, 1) = 0
  1567.             aFilter(4, 2) = -1
  1568.             aFilter(4, 3) = 0
  1569.             aFilter(4, 4) = 0
  1570.         Case 30 'SovelVsPrewitt 3x3
  1571.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1572.             ReDim aFilter2(0 To filterHeight - 1, 0 To filterWidth - 1)
  1573.             'horizontal -> Sobel h
  1574.             aFilter(0, 0) = 1
  1575.             aFilter(0, 1) = 2
  1576.             aFilter(0, 2) = 1
  1577.             aFilter(1, 0) = 0
  1578.             aFilter(1, 1) = 0
  1579.             aFilter(1, 2) = 0
  1580.             aFilter(2, 0) = -1
  1581.             aFilter(2, 1) = -2
  1582.             aFilter(2, 2) = -1
  1583.             'vertical -> Prewitt v
  1584.             aFilter2(0, 0) = 1
  1585.             aFilter2(0, 1) = 1
  1586.             aFilter2(0, 2) = 1
  1587.             aFilter2(1, 0) = 0
  1588.             aFilter2(1, 1) = 0
  1589.             aFilter2(1, 2) = 0
  1590.             aFilter2(2, 0) = -1
  1591.             aFilter2(2, 1) = -1
  1592.             aFilter2(2, 2) = -1
  1593.         Case 31 'Gaussian3x3
  1594.             ReDim aFilter(0 To filterHeight - 1, 0 To filterWidth - 1)
  1595.             aFilter(0, 0) = 1
  1596.             aFilter(0, 1) = 2
  1597.             aFilter(0, 2) = 1
  1598.             aFilter(1, 0) = 2
  1599.             aFilter(1, 1) = 4
  1600.             aFilter(1, 2) = 2
  1601.             aFilter(2, 0) = 1
  1602.             aFilter(2, 1) = 2
  1603.             aFilter(2, 2) = 1
  1604.     End Select
  1605.    
  1606.     fW = filterWidth / 2
  1607.     fH = filterHeight / 2
  1608.     For iY = 0 To iH - 1
  1609.         iRowOffset = iY * iW
  1610.         For iX = 0 To iW - 1
  1611.             fRedSum = 0.0
  1612.             fRedSumX = 0.0
  1613.             fRedSumY = 0.0
  1614.             fGreenSum = 0.0
  1615.             fGreenSumX = 0.0
  1616.             fGreenSumY = 0.0
  1617.             fBlueSum = 0.0
  1618.             fBlueSumX = 0.0
  1619.             fBlueSumY = 0.0
  1620.             fSum = 0.0
  1621.             For filterY = 0 To filterHeight - 1
  1622.                 For filterX = 0 To filterWidth - 1
  1623.                     imageX = Int(iX - fW + filterX + iW) Mod iW
  1624.                     imageY = Int(iY - fH + filterY + iH) Mod iH
  1625.                     c =  Cast(Integer Ptr, tBitmapData.Scan0)[imageY * iW + imageX]
  1626.                     iR = ((c Shr 16) And &hFF)
  1627.                     iG = ((c Shr 8) And &hFF)
  1628.                     iB = (c And &hFF)
  1629.                     Select Case iMode
  1630.                         Case 20, 24, 25, 30
  1631.                             fMatrixX = aFilter(filterY, filterX)
  1632.                             fMatrixY = aFilter2(filterY, filterX)
  1633.                             fRedSumX += iR * fMatrixX
  1634.                             fRedSumY += iR * fMatrixY
  1635.                             fGreenSumX += iG * fMatrixX
  1636.                             fGreenSumY += iG * fMatrixY
  1637.                             fBlueSumX += iB * fMatrixX
  1638.                             fBlueSumY += iB * fMatrixY
  1639.                             fSum += (fMatrixX + fMatrixY)
  1640.                         Case Else
  1641.                             fMatrix = aFilter(filterY, filterX)
  1642.                             fRedSum += iR * fMatrix
  1643.                             fGreenSum += iG * fMatrix
  1644.                             fBlueSum += iB * fMatrix
  1645.                             fSum += fMatrix
  1646.                     End Select
  1647.                 Next
  1648.             Next
  1649.             fSum = IIf(fSum <= 0, 1.0, fSum)
  1650.             Select Case iMode
  1651.                 Case 20, 24, 25, 30
  1652.                     fRedSum = Sqr(fRedSumX * fRedSumX + fRedSumY * fRedSumY)
  1653.                     fGreenSum = Sqr(fGreenSumX * fGreenSumX + fGreenSumY * fGreenSumY)
  1654.                     fBlueSum = Sqr(fBlueSumX * fBlueSumX + fBlueSumY * fBlueSumY)
  1655.                 Case Else
  1656.                    
  1657.             End Select         
  1658.             'iRGB = Min(Max(Int(fFactor * fRedSum / fSum + fBias), 0), 255) Shl 16 + Min(Max(Int(fFactor * fGreenSum / fSum + fBias), 0), 255) Shl 8 + Min(Max(Int(fFactor * fBlueSum / fSum + fBias), 0), 255)
  1659.             iRGB = Min(Abs(Int(fFactor * fRedSum / fSum + fBias)), 255) Shl 16 + _
  1660.                      Min(Abs(Int(fFactor * fGreenSum / fSum + fBias)), 255) Shl 8 + _
  1661.                      Min(Abs(Int(fFactor * fBlueSum / fSum + fBias)), 255)
  1662.             'iRGB = Min(Abs(Int(fFactor * fRedSum + fBias)), 255) Shl 16 + Min(Abs(Int(fFactor * fGreenSum + fBias)), 255) Shl 8 + Min(Abs(Int(fFactor * fBlueSum + fBias)), 255)
  1663.             Cast(Integer Ptr, tBitmapData_Dest.Scan0)[iRowOffset + iX] = iAlpha + iRGB
  1664.         Next
  1665.     Next
  1666.  
  1667.     GdipBitmapUnlockBits(hBitmap_Dest, @tBitmapData_Dest)
  1668.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  1669.     If bGDI Then
  1670.         GdipCreateHBITMAPFromBitmap(hBitmap_Dest, @hGDIBitmap, &hFF000000)
  1671.         GdipDisposeImage(hBitmap_Dest)
  1672.         Return hGDIBitmap
  1673.     EndIf
  1674.     Return hBitmap_Dest
  1675. End Function
  1676.  
  1677. Function _GDIPlus_BitmapApplyFilter_Raster(ByVal hImage As Any Ptr, iSizeW As ULong, iSizeH As ULong, fDensity As Single, fBrightness As Single, fBias As Single, iMode As Byte, bGDI As Bool) As Any Ptr Export
  1678.     Dim As Any Ptr hBitmap_Raster, hGDIBitmap, hBitmap_BW, hBitmap_Grey, hBitmap_tmp, hBitmap_tmp2, hGfx, hGfx_tmp, hGfx_tmp2, hBrush
  1679.     Dim As Single iW, iH, fDen, fSizeW, fSizeH
  1680.     Dim As ULong iX, iY, iColor, iColor2, c, iWH
  1681.     Dim As Integer iStatus
  1682.  
  1683.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  1684.     If iStatus <> 0 Then Return 0
  1685.    
  1686.     iSizeW = IIf(iSizeW < 3, 3, IIf(iSizeW > iW / 3, iW / 3, iSizeW))
  1687.     iSizeH = IIf(iSizeH < 3, 3, IIf(iSizeH > iH / 3, iH / 3, iSizeH))
  1688.    
  1689.     GdipCloneBitmapArea(0, 0, iW, iH, PixelFormat1bppIndexed, hImage, @hBitmap_BW)
  1690.     'hBitmap_BW = _GDIPlus_BitmapCreateBW(hImage, &h60)
  1691.     hBitmap_Grey = _GDIPlus_BitmapCreateGreyscale(hImage)
  1692.    
  1693.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Raster)
  1694.     GdipGetImageGraphicsContext(hBitmap_Raster, @hGfx)
  1695.     GdipSetSmoothingMode(hGfx, 4)
  1696.     GdipSetPixelOffsetMode(hGfx, 4)
  1697.     GdipGraphicsClear(hGfx, &hFFFFFFFF)
  1698.    
  1699.     GdipCreateBitmapFromScan0(iSizeW, iSizeH, 0, PixelFormat32bppARGB, 0, @hBitmap_tmp)
  1700.     GdipGetImageGraphicsContext(hBitmap_tmp, @hGfx_tmp)
  1701.    
  1702.     GdipCreateBitmapFromScan0(iSizeW, iSizeH, 0, PixelFormat32bppARGB, 0, @hBitmap_tmp2)
  1703.     GdipGetImageGraphicsContext(hBitmap_tmp2, @hGfx_tmp2)
  1704.     If iMode < 1 Then iMode = 1
  1705.     If fDensity < 0 Then fDensity = 0
  1706.     If fBrightness < 1 Then fBrightness = 1
  1707.    
  1708.     iWH = iSizeW * iSizeH
  1709.    
  1710.     For iY = 0 To iH - 1 Step iSizeH
  1711.         For iX = 0 To iW - 1 Step iSizeW
  1712.             GdipDrawImageRectRect(hGfx_tmp, hBitmap_Grey, 0, 0, iSizeW, iSizeH, iX, iY, iSizeW, iSizeH, 2, 0, 0, 0)
  1713.             GdipDrawImageRectRect(hGfx_tmp2, hImage, 0, 0, iSizeW, iSizeH, iX, iY, iSizeW, iSizeH, 2, 0, 0, 0)
  1714.             iColor = _GDIPlus_BitmapGetAverageColorValue(hBitmap_tmp, 1)
  1715.             iColor2 = _GDIPlus_BitmapGetAverageColorValue(hBitmap_tmp2, 0)
  1716.             If iMode = 1 Then
  1717.                 GdipCreateSolidFill(iColor2, @hBrush)
  1718.             Else
  1719.                 GdipCreateSolidFill(&hFF000000, @hBrush)
  1720.             End If
  1721.             c = (((iColor Shr 16) And &hFF) + ((iColor Shr 8) And &hFF) + (iColor And &hFF)) / fBrightness
  1722.             fDen = fDensity + c / iWH
  1723.             fSizeW = iSizeW * fDen
  1724.             fSizeW = IIf(fSizeW > iSizeW + fBias, iSizeW, fSizeW + fBias)
  1725.             fSizeH = iSizeH * fDen
  1726.             fSizeH = IIf(fSizeH > iSizeH + fBias, iSizeH, fSizeH + fBias)
  1727.             GdipFillEllipse(hGfx, hBrush, iX + (iSizeW - fSizeW) / 2, iY + (iSizeH - fSizeH) / 2, fSizeW, fSizeH)
  1728.             GdipDeleteBrush(hBrush)
  1729.         Next
  1730.     Next
  1731.    
  1732.     GdipDeleteGraphics(hGfx_tmp)
  1733.     GdipDisposeImage(hBitmap_tmp)
  1734.     GdipDeleteGraphics(hGfx_tmp2)
  1735.     GdipDisposeImage(hBitmap_tmp2)
  1736.     GdipDeleteGraphics(hGfx)
  1737.     'GdipDisposeImage(hBitmap_BW)
  1738.     GdipDisposeImage(hBitmap_Grey)
  1739.    
  1740.     If bGDI Then
  1741.         GdipCreateHBITMAPFromBitmap(hBitmap_Raster, @hGDIBitmap, &hFF000000)
  1742.         GdipDisposeImage(hBitmap_Raster)
  1743.         Return hGDIBitmap
  1744.     EndIf
  1745.     Return hBitmap_Raster
  1746. End Function
  1747.  
  1748. Function _GDIPlus_BitmapApplyFilter_Pixelate(ByVal hImage As Any Ptr, iPixelate As UByte, bGrid As Bool, bGDI As Bool) As Any Ptr Export
  1749.     Dim As Single iW, iH, i
  1750.     Dim As ULong iNewW, iNewH
  1751.     Dim As Any Ptr hBitmap_scaled, hBitmap_pixelated, hGDIBitmap, hGfx, hPen
  1752.     Dim As Integer iStatus
  1753.  
  1754.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  1755.     If iStatus <> 0 Then Return 0
  1756.    
  1757.     iPixelate = IIf(iPixelate < 2, 2, iPixelate)
  1758.     iNewW = CLng(iW / iPixelate)
  1759.     iNewH = CLng(iH / iPixelate)
  1760.  
  1761.     GdipCreateBitmapFromScan0(iNewW, iNewH, 0, PixelFormat32bppARGB, 0, @hBitmap_scaled)
  1762.     GdipGetImageGraphicsContext(hBitmap_scaled, @hGfx)
  1763.     GdipSetInterpolationMode(hGfx, 7)
  1764.     GdipDrawImageRect(hGfx, hImage, 0, 0, iNewW, iNewH)
  1765.     GdipDeleteGraphics(hGfx)
  1766.    
  1767.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_pixelated)
  1768.     GdipGetImageGraphicsContext(hBitmap_pixelated, @hGfx)
  1769.     GdipSetInterpolationMode(hGfx, 5)
  1770.     GdipSetPixelOffsetMode(hGfx, 2)
  1771.     GdipDrawImageRectRect(hGfx, hBitmap_scaled, 0, 0, iW, iH, 0, 0, iNewW, iNewH, 2, 0, 0, 0)
  1772.    
  1773.     If bGrid Then
  1774.         GdipCreatePen1(&h80000000, 1, 2, @hPen)
  1775.         Dim As Single iStepW = iW / iNewW, iStepH = iH / iNewH
  1776.         For i = 0 To iW - 1 Step iStepW
  1777.             GdipDrawLine(hGfx, hPen, i, 0, i, iH)
  1778.         Next
  1779.        
  1780.         For i = 0 To iH - 1 Step iStepH
  1781.             GdipDrawLine(hGfx, hPen, 0, i, iW, i)
  1782.         Next
  1783.            
  1784.         GdipDeletePen(hPen)
  1785.     End If
  1786.    
  1787.     GdipDeleteGraphics(hGfx)
  1788.     GdipDisposeImage(hBitmap_scaled)
  1789.     If bGDI Then
  1790.         GdipCreateHBITMAPFromBitmap(hBitmap_pixelated, @hGDIBitmap, &hFF000000)
  1791.         GdipDisposeImage(hBitmap_pixelated)
  1792.         Return hGDIBitmap
  1793.     EndIf
  1794.     Return hBitmap_pixelated
  1795. End Function
  1796.  
  1797. Function _GDIPlus_BitmapApplyFilter_Dilatation(ByVal hImage As Any Ptr, Size As UByte, bGDI As Bool) As Any Ptr Export 'based on original code by Jakub Szymanowski
  1798.     Dim As Single iW, iH
  1799.     Dim As Any Ptr hBitmap_Dilate, hGDIBitmap
  1800.     Dim As BitmapData tBitmapData, tBitmapData_Dilate
  1801.     Dim As Long iX, iY, x2, y2, TempX, TempY, TempColor, c, r, g, b, RValue, GValue, BValue, ApetureMin, ApetureMax
  1802.     Dim As Integer iStatus
  1803.  
  1804.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  1805.     If iStatus <> 0 Then Return 0
  1806.    
  1807.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  1808.    
  1809.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Dilate)
  1810.     GdipBitmapLockBits(hBitmap_Dilate, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Dilate)
  1811.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  1812.    
  1813.     Size = IIf(Size < 2, 2, IIf(Size > 32, 32, Size))
  1814.    
  1815.     ApetureMin = -(Size / 2)
  1816.     ApetureMax = (Size / 2)
  1817.    
  1818.     For iX = 0 To iW - 1
  1819.         For iY = 0 To iH - 1
  1820.             RValue = 0
  1821.             GValue = 0
  1822.             BValue = 0
  1823.             For x2 = ApetureMin To ApetureMax
  1824.                     TempX = iX + x2        
  1825.                     If (TempX >= 0) And (TempX < iW) Then
  1826.                         For y2 = ApetureMin To ApetureMax
  1827.                             TempY = iY + y2
  1828.                             If (TempY >= 0) And (TempY < iH) Then
  1829.                                 TempColor = cast(Integer Ptr, tBitmapData.Scan0)[(TempY * iW) + TempX]
  1830.                                
  1831.                                 r = (TempColor Shr 16) And &hFF
  1832.                                 g = (TempColor Shr 8) And &hFF
  1833.                                 b = TempColor And &hFF
  1834.  
  1835.                                 If r > RValue Then RValue = r
  1836.                                 If g > GValue Then GValue = g
  1837.                                 If b > BValue Then BValue = b
  1838.  
  1839.                             End If
  1840.                         Next
  1841.                     End If                 
  1842.             Next
  1843.             Cast(Integer Ptr, tBitmapData_Dilate.Scan0)[iY * iW + iX] = &hFF000000 + RValue Shl 16 + GValue Shl 8 + BValue
  1844.         Next
  1845.     Next
  1846.     GdipBitmapUnlockBits(hBitmap_Dilate, @tBitmapData_Dilate)
  1847.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  1848.    
  1849.     If bGDI Then
  1850.         GdipCreateHBITMAPFromBitmap(hBitmap_Dilate, @hGDIBitmap, &hFF000000)
  1851.         GdipDisposeImage(hBitmap_Dilate)
  1852.         Return hGDIBitmap
  1853.     EndIf
  1854.     Return hBitmap_Dilate  
  1855. End Function
  1856.  
  1857. Function _GDIPlus_BitmapApplyFilter_Erosion(ByVal hImage As Any Ptr, Size As UByte, bGDI As Bool) As Any Ptr Export 'based on original code by Jakub Szymanowski
  1858.     Dim As Single iW, iH
  1859.     Dim As Any Ptr hBitmap_Erosion, hGDIBitmap
  1860.     Dim As BitmapData tBitmapData, tBitmapData_Erosion
  1861.     Dim As Long iX, iY, x2, y2, TempX, TempY, TempColor, c, r, g, b, RValue, GValue, BValue, ApetureMin, ApetureMax
  1862.     Dim As Integer iStatus
  1863.  
  1864.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  1865.     If iStatus <> 0 Then Return 0
  1866.    
  1867.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  1868.    
  1869.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Erosion)
  1870.     GdipBitmapLockBits(hBitmap_Erosion, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Erosion)
  1871.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  1872.    
  1873.     Size = IIf(Size < 2, 2, IIf(Size > 32, 32, Size))
  1874.    
  1875.     ApetureMin = -(Size / 2)
  1876.     ApetureMax = (Size / 2)
  1877.    
  1878.     For iX = 0 To iW - 1
  1879.         For iY = 0 To iH - 1
  1880.             RValue = &hFF
  1881.             GValue = &hFF
  1882.             BValue = &hFF
  1883.             For x2 = ApetureMin To ApetureMax
  1884.                     TempX = iX + x2        
  1885.                     If (TempX >= 0) And (TempX < iW) Then
  1886.                         For y2 = ApetureMin To ApetureMax
  1887.                             TempY = iY + y2
  1888.                             If (TempY >= 0) And (TempY < iH) Then
  1889.                                 TempColor = cast(Integer Ptr, tBitmapData.Scan0)[(TempY * iW) + TempX]
  1890.                                
  1891.                                 r = (TempColor Shr 16) And &hFF
  1892.                                 g = (TempColor Shr 8) And &hFF
  1893.                                 b = TempColor And &hFF
  1894.  
  1895.                                 If r < RValue Then RValue = r
  1896.                                 If g < GValue Then GValue = g
  1897.                                 If b < BValue Then BValue = b
  1898.  
  1899.                             End If
  1900.                         Next
  1901.                     End If                 
  1902.             Next
  1903.             Cast(Integer Ptr, tBitmapData_Erosion.Scan0)[iY * iW + iX] = &hFF000000 + RValue Shl 16 + GValue Shl 8 + BValue
  1904.         Next
  1905.     Next
  1906.     GdipBitmapUnlockBits(hBitmap_Erosion, @tBitmapData_Erosion)
  1907.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  1908.    
  1909.     If bGDI Then
  1910.         GdipCreateHBITMAPFromBitmap(hBitmap_Erosion, @hGDIBitmap, &hFF000000)
  1911.         GdipDisposeImage(hBitmap_Erosion)
  1912.         Return hGDIBitmap
  1913.     EndIf
  1914.     Return hBitmap_Erosion 
  1915. End Function
  1916.  
  1917. Function _GDIPlus_BitmapApplyFilter_OilPainting(ByVal hImage As Any Ptr, iRadius As UByte, fIntensityLevels As Single, bGDI As Bool) As Any Ptr Export 'based on original code by Santhosh G_ (http://www.codeproject.com/Articles/471994/OilPaintEffect)
  1918.     Dim As Single iW, iH
  1919.     Dim As Any Ptr hBitmap_OilPainting, hGDIBitmap
  1920.     Dim As BitmapData tBitmapData, tBitmapData_OilPainting
  1921.     Dim As Long i, iX, iY, iX_O, iY_O, iR, iG, iB, iCurIntensity, iCurMax, iMaxIndex, iRowOffset
  1922.     Dim As Single aSumR(0 To 255), aSumG(0 To 255), aSumB(0 To 255), aIntensityCount(0 To 255)
  1923.     Dim As Const Single fI = fIntensityLevels / 255
  1924.     Dim As ULong TempColor, c
  1925.     Dim As Integer iStatus, iPosX, iPosY
  1926.  
  1927.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  1928.     If iStatus <> 0 Then Return 0
  1929.    
  1930.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  1931.    
  1932.     iRadius = IIf(iRadius < 1, 1, IIf(iRadius > 32, 32, iRadius))
  1933.    
  1934.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_OilPainting)
  1935.    
  1936.     GdipBitmapLockBits(hBitmap_OilPainting, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_OilPainting)
  1937.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  1938.    
  1939.    
  1940.     For iY = 0 To iH  - 1
  1941.         iRowOffset = iY  * iW
  1942.         For iX = 0 To iW  - 1
  1943.            
  1944.             For iY_O = -iRadius To iRadius
  1945.                 For iX_O = -iRadius To iRadius
  1946.                    
  1947.                     iPosX = Int((iX + iX_O) Mod iW)
  1948.                     iPosY = Int((iY + iY_O) Mod iH)
  1949.                     If iPosX < 0 Then iPosX = 0
  1950.                     If iPosY < 0 Then iPosY = 0
  1951.  
  1952.                     TempColor = Cast(Integer Ptr, tBitmapData.Scan0)[iPosY * iW + iPosX]
  1953.                    
  1954.                     iR = (TempColor Shr 16) And &hFF
  1955.                     iG = (TempColor Shr 8) And &hFF
  1956.                     iB = TempColor And &hFF
  1957.                    
  1958.                     iCurIntensity = (iR * 213 + iG * 715 + iB * 72) / 1000 * fI ' luminance method
  1959.                     If iCurIntensity > 255 Then iCurIntensity = 255
  1960.  
  1961.                     aIntensityCount(iCurIntensity) += 1
  1962.                     aSumR(Int(iCurIntensity)) += iR
  1963.                     aSumG(Int(iCurIntensity)) += iG
  1964.                     aSumB(Int(iCurIntensity)) += iB
  1965.                 Next
  1966.             Next
  1967.             iCurMax = 0
  1968.             iMaxIndex = 0
  1969.             For i = 0 To 255
  1970.                 If aIntensityCount(i) > iCurMax Then
  1971.                     iCurMax = aIntensityCount(i)
  1972.                     iMaxIndex = i
  1973.                 EndIf
  1974.             Next
  1975.            
  1976.             Cast(Integer Ptr, tBitmapData_OilPainting.Scan0)[iRowOffset + iX] = &hFF000000 + (aSumR(iMaxIndex) / iCurMax) Shl 16 + (aSumG(iMaxIndex) / iCurMax) Shl 8 + (aSumB(iMaxIndex) / iCurMax)
  1977.            
  1978.             For i = 0 To 255
  1979.                 aIntensityCount(i) = 0
  1980.                 aSumR(i) = 0
  1981.                 aSumG(i) = 0
  1982.                 aSumB(i) = 0
  1983.             Next
  1984.            
  1985.         Next
  1986.     Next
  1987.     GdipBitmapUnlockBits(hBitmap_OilPainting, @tBitmapData_OilPainting)
  1988.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  1989.    
  1990.     If bGDI Then
  1991.         GdipCreateHBITMAPFromBitmap(hBitmap_OilPainting, @hGDIBitmap, &hFF000000)
  1992.         GdipDisposeImage(hBitmap_OilPainting)
  1993.         Return hGDIBitmap
  1994.     EndIf
  1995.     Return hBitmap_OilPainting
  1996. End Function
  1997.  
  1998. Function _GDIPlus_BitmapApplyFilter_ColorAccent(ByVal hImage As Any Ptr, iHue As UShort, fRange As Single, bGDI As Bool) As Any Ptr Export 'based on original code by Jakub Szymanowski
  1999.     Dim As Single iW, iH
  2000.     Dim As Any Ptr hBitmap_ColorAccent, hGDIBitmap
  2001.     Dim As BitmapData tBitmapData, tBitmapData_ColorAccent
  2002.     Dim As Long iX, iY, iRowOffset, c, iR, iG, iB
  2003.     Dim As Single fH, fCMax, fCMin, fDelta, fH1, fH2
  2004.     Dim As Integer iStatus
  2005.  
  2006.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  2007.     If iStatus <> 0 Then Return 0
  2008.    
  2009.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  2010.    
  2011.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_ColorAccent)
  2012.     GdipBitmapLockBits(hBitmap_ColorAccent, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_ColorAccent)
  2013.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  2014.    
  2015.     fH1 = (iHue - fRange / 2 + 360) Mod 360
  2016.     fH2 = (iHue + fRange / 2 + 360) Mod 360
  2017.     For iY = 0 To iH - 1
  2018.         iRowOffset = iY * iW
  2019.         For iX = 1 To iW - 1
  2020.             c = cast(Integer Ptr, tBitmapData.Scan0)[iRowOffset + iX]
  2021.             iR = (c Shr 16) And &hFF
  2022.             iG = (c Shr 8) And &hFF
  2023.             iB = c And &hFF
  2024.            
  2025.             'convert RGB to Hue value only     
  2026.             fCMax = Max3(iR, iG, iB)
  2027.             fCMin = Min3(iR, iG, iB)
  2028.             fDelta = fCMax - fCMin
  2029.            
  2030.             If fDelta = 0 Then fH = 0
  2031.             If fCMax = iR Then fH = 60 * (((iG - iB) / fDelta) Mod 6)
  2032.             If fCMax = iG Then fH = 60 * (((iB - iR) / fDelta) + 2)
  2033.             If fCMax = iB Then fH = 60 * (((iR - iG) / fDelta) + 4)
  2034.            
  2035.             If fH1 <= fH2 Then
  2036.                 If fH >= fH1 And fH <= fH2 Then
  2037.                     Cast(Integer Ptr, tBitmapData_ColorAccent.Scan0)[iRowOffset + iX] = &hFF000000 + c
  2038.                 Else
  2039.                     c = Int((iR * 213 + iG * 715 + iB * 72) / 1000)
  2040.                     Cast(Integer Ptr, tBitmapData_ColorAccent.Scan0)[iRowOffset + iX] = &hFF000000 + c Shl 16 + c Shl 8 + c
  2041.                 EndIf
  2042.             Else
  2043.                 If fH >= fH1 Or fH <= fH2 Then
  2044.                     Cast(Integer Ptr, tBitmapData_ColorAccent.Scan0)[iRowOffset + iX] = &hFF000000 + c
  2045.                 Else
  2046.                     c = Int((iR * 213 + iG * 715 + iB * 72) / 1000)
  2047.                     Cast(Integer Ptr, tBitmapData_ColorAccent.Scan0)[iRowOffset + iX] = &hFF000000 + c Shl 16 + c Shl 8 + c            
  2048.                 EndIf
  2049.             EndIf
  2050.         Next
  2051.     Next
  2052.    
  2053.     GdipBitmapUnlockBits(hBitmap_ColorAccent, @tBitmapData_ColorAccent)
  2054.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  2055.     If bGDI Then
  2056.         GdipCreateHBITMAPFromBitmap(hBitmap_ColorAccent, @hGDIBitmap, &hFF000000)
  2057.         GdipDisposeImage(hBitmap_ColorAccent)
  2058.         Return hGDIBitmap
  2059.     EndIf
  2060.     Return hBitmap_ColorAccent
  2061. End Function
  2062.  
  2063. Function _GDIPlus_BitmapApplyFilter_PenSketch(ByVal hImage As Any Ptr, iThreshold As Single, bGDI As Bool) As Any Ptr Export 'based on original code by Jakub Szymanowski
  2064.     Dim As Any Ptr hBitmap_PenSketch, hBitmap_Greyscale, hBitmap_Edge, hBitmap_Negative, hBitmap_Blur, hGDIBitmap
  2065.    
  2066.     hBitmap_Greyscale = _GDIPlus_BitmapCreateGreyscale(hImage)
  2067.     hBitmap_Edge = _GDIPlus_BitmapApplyFilter_Convolution(hBitmap_Greyscale, 1.25, iThreshold, 20, 0, 0, 0)
  2068.     hBitmap_Negative = _GDIPlus_BitmapCreateNegative(hBitmap_Edge)
  2069.     hBitmap_Blur = _GDIPlus_BitmapApplyFilter_Convolution(hBitmap_Negative, 1.15, 0, 8, 0, 0, 0)
  2070.     hBitmap_PenSketch = _GDIPlus_BitmapApplyFilter_SymmetricNearestNeighbour(hBitmap_Blur, 6, 0)
  2071.    
  2072.     GdipDisposeImage(hBitmap_Greyscale)
  2073.     GdipDisposeImage(hBitmap_Edge)
  2074.     GdipDisposeImage(hBitmap_Negative)
  2075.     GdipDisposeImage(hBitmap_Blur)
  2076.    
  2077.     If bGDI Then
  2078.         GdipCreateHBITMAPFromBitmap(hBitmap_PenSketch, @hGDIBitmap, &hFF000000)
  2079.         GdipDisposeImage(hBitmap_PenSketch)
  2080.         Return hGDIBitmap
  2081.     EndIf
  2082.     Return hBitmap_PenSketch
  2083. End Function
  2084.  
  2085. Function _GDIPlus_BitmapApplyFilter_PenSketch2(ByVal hImage As Any Ptr, iThreshold As UByte, bGDI As Bool) As Any Ptr Export
  2086.     Dim As Any Ptr hBitmap_PenSketch2, hBitmap_Median, hBitmap_Median2, hBitmap_Edge, hBitmap_Inverse, hGDIBitmap
  2087.  
  2088.     hBitmap_Median = _GDIPlus_BitmapApplyFilter_Median(hImage, 4, 0)
  2089.     hBitmap_Edge = _GDIPlus_BitmapApplyFilter_Convolution(hBitmap_Median, 1, iThreshold, 20, 0, 0, 0)
  2090.     hBitmap_Inverse = _GDIPlus_BitmapCreateInverseGreyscale(hBitmap_Edge, 80)
  2091.     hBitmap_Median2 = _GDIPlus_BitmapApplyFilter_Median(hBitmap_Inverse, 3, 0)
  2092.     hBitmap_PenSketch2 = _GDIPlus_BitmapCreateNegative(hBitmap_Median2)
  2093.    
  2094.     GdipDisposeImage(hBitmap_Median)
  2095.     GdipDisposeImage(hBitmap_Edge)
  2096.     GdipDisposeImage(hBitmap_Inverse)
  2097.     GdipDisposeImage(hBitmap_Median2)
  2098.    
  2099.     If bGDI Then
  2100.         GdipCreateHBITMAPFromBitmap(hBitmap_PenSketch2, @hGDIBitmap, &hFF000000)
  2101.         GdipDisposeImage(hBitmap_PenSketch2)
  2102.         Return hGDIBitmap
  2103.     EndIf
  2104.     Return hBitmap_PenSketch2
  2105. End Function
  2106.  
  2107. Function _GDIPlus_BitmapApplyFilter_Cartoon1(ByVal hImage As Any Ptr, iRadius As UByte, fIntensityLevels As Single, iThreshold As UByte, bGDI As Bool) As Any Ptr Export 'based on original code by Jakub Szymanowski
  2108.     Dim As Single iW, iH
  2109.     Dim As Any Ptr hBitmap_Cartoon1, hGDIBitmap, hBitmap_Oil, hBitmap_Edge, hBitmap_Sobel, hBitmap_Blur, hGfx, hPen
  2110.     Dim As BitmapData tBitmapData, tBitmapData_Edge, tBitmapData_Oil, tBitmapData_Cartoon1
  2111.     Dim As Long iX, iY, iRowOffset, cE, cO, iRed
  2112.     Dim As Integer iStatus
  2113.  
  2114.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  2115.     If iStatus <> 0 Then Return 0
  2116.    
  2117.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  2118.    
  2119.     hBitmap_Oil = _GDIPlus_BitmapApplyFilter_OilPainting(hImage, iRadius, fIntensityLevels, 0)
  2120.     hBitmap_Sobel = _GDIPlus_BitmapApplyFilter_Convolution(hImage, 1.0, 32, 20, 0, 0, 0)
  2121.     hBitmap_Blur = _GDIPlus_BitmapApplyFilter_Convolution(hBitmap_Sobel, 1, 0, 28, 0, 0, 0)
  2122.     hBitmap_Edge = _GDIPlus_BitmapCreateInverseBW(hBitmap_Blur, iThreshold)
  2123.    
  2124.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Cartoon1)
  2125.     GdipBitmapLockBits(hBitmap_Cartoon1, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Cartoon1)
  2126.     GdipBitmapLockBits(hBitmap_Edge, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData_Edge)
  2127.     GdipBitmapLockBits(hBitmap_Oil, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData_Oil)
  2128.  
  2129.     For iY = 0 To iH - 1
  2130.         iRowOffset = iY * iW
  2131.         For iX = 1 To iW - 1
  2132.             cE = cast(Integer Ptr, tBitmapData_Edge.Scan0)[iRowOffset + iX]
  2133.             iRed = (cE Shr 16) And &hFF
  2134.             If iRed < &h80 Then
  2135.                 cO = cast(Integer Ptr, tBitmapData_Oil.Scan0)[iRowOffset + iX]
  2136.                 Cast(Integer Ptr, tBitmapData_Cartoon1.Scan0)[iRowOffset + iX] = cO
  2137.             Else
  2138.                 Cast(Integer Ptr, tBitmapData_Cartoon1.Scan0)[iRowOffset + iX] = cE Xor &h00FFFFFF
  2139.             EndIf
  2140.         Next
  2141.     Next
  2142.    
  2143.     GdipBitmapUnlockBits(hBitmap_Cartoon1, @tBitmapData_Cartoon1)
  2144.     GdipBitmapUnlockBits(hBitmap_Edge, @tBitmapData_Edge)
  2145.     GdipBitmapUnlockBits(hBitmap_Oil, @tBitmapData_Oil)
  2146.    
  2147.     GdipDisposeImage(hBitmap_Oil)
  2148.     GdipDisposeImage(hBitmap_Sobel)
  2149.     GdipDisposeImage(hBitmap_Edge)
  2150.     GdipDisposeImage(hBitmap_Blur)
  2151.    
  2152.     /'
  2153.     GdipGetImageGraphicsContext(hBitmap_Cartoon1, @hGfx)
  2154.     Dim As Single fSize, fRadius
  2155.     fSize = iRadius
  2156.     fRadius = fSize / 2
  2157.     GdipCreatePen1(&hFF000000, fSize, 2, @hPen)
  2158.     GdipDrawRectangle(hGfx, hPen, fRadius, fRadius, iW - fSize, iH - fSize)
  2159.     GdipDeletePen(hPen)
  2160.     GdipDeleteGraphics(hGfx)
  2161.     '/
  2162.    
  2163.     If bGDI Then
  2164.         GdipCreateHBITMAPFromBitmap(hBitmap_Cartoon1, @hGDIBitmap, &hFF000000)
  2165.         GdipDisposeImage(hBitmap_Cartoon1)
  2166.         Return hGDIBitmap
  2167.     EndIf
  2168.     Return hBitmap_Cartoon1
  2169. End Function
  2170.  
  2171. Function _GDIPlus_BitmapApplyFilter_TiltShift(ByVal hImage As Any Ptr, fPosY_Start As Single, iIntensity As UByte, bGDI As Bool) As Any Ptr Export 'based on original code by Jakub Szymanowski
  2172.     Dim As Single iW, iH, fCounterR, fCounterG, fCounterB, fDominator, sigma, fPosY_End
  2173.     Dim as Double gauss, L, S
  2174.     Dim As Any Ptr hBitmap_TiltShift, hGDIBitmap
  2175.     Dim As BitmapData tBitmapData, tBitmapData_TiltShift
  2176.     Dim As Integer iStatus, iX, iY, k, b, y, y1, y2, newR, newG, newB, c, iARGB, iARGB1, iARGB2, iOffset
  2177.  
  2178.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  2179.     If iStatus <> 0 Then Return 0
  2180.    
  2181.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  2182.    
  2183.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_TiltShift)
  2184.     GdipBitmapLockBits(hBitmap_TiltShift, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_TiltShift)
  2185.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  2186.    
  2187.     fPosY_End = (fPosY_Start + fPosY_Start / 2)
  2188.     If fPosY_End > iH Or fPosY_Start < 0 Then
  2189.         fPosY_Start = iH / 2
  2190.         fPosY_End = fPosY_Start + fPosY_Start / 2
  2191.     EndIf
  2192.     L = 0.5 'is defined function value for blurring in close proximity to sharp part (ex. in range 0.05 - 0.15)
  2193.     S = 6.5 'is defined function value for blurring in far proximity to sharp part (ex. in range 5 - 7)
  2194.     Dim Filter(0 To iIntensity) As Double
  2195.    
  2196.     For iY = 0 To iH - 1
  2197.         iOffset = iY * iW
  2198.         For iX = 0 To iW - 1
  2199.             If (iY >= fPosY_Start) And (iY <= fPosY_End) Then
  2200.                 Cast(Integer Ptr, tBitmapData_TiltShift.Scan0)[iOffset + iX] = Cast(Integer Ptr, tBitmapData.Scan0)[iOffset + iX]
  2201.             Else
  2202.                 If iY < fPosY_Start Then
  2203.                     sigma = L  + (S - L) * (fPosY_Start - iY) / fPosY_Start     'fPosY_Start - iY = is height of larger blurred field (in vertical blurring)
  2204.                 ElseIf iY > fPosY_End Then                                              'fPosY_Start = is height of larger blurred field (in vertical blurring)
  2205.                     sigma = L  + (S - L) * (iY - fPosY_End) / fPosY_Start
  2206.                 EndIf
  2207.                 'ReDim Filter(0 To iIntensity) As Double
  2208.                 c = 0
  2209.                 For k = 0 To iIntensity - 1
  2210.                     gauss = (1 / (fPiSqr * sigma)) * Exp((-k * k) / (2 * sigma * sigma))
  2211.                     If Not (gauss < 0.003) Then
  2212.                         Filter(c) = gauss
  2213.                         c += 1
  2214.                     EndIf  
  2215.                 Next
  2216.                 iARGB = Cast(Integer Ptr, tBitmapData.Scan0)[iOffset + iX]
  2217.                 fCounterR = Filter(0) * ((iARGB Shr 16) And &hFF)
  2218.                 fCounterG = Filter(0) * ((iARGB Shr 8) And &hFF)
  2219.                 fCounterB = Filter(0) * (iARGB And &hFF)
  2220.                 fDominator = Filter(0)
  2221.                 For b = 1 To c - 1
  2222.                     fDominator += 2 * Filter(b)
  2223.                     y1 = iY - b
  2224.                     y2 = iY + b
  2225.                     If y1 < 0 Then
  2226.                         y1 = Abs(y1)
  2227.                     ElseIf y2 >= iH Then
  2228.                         y2 = y2 + b - iH + 1
  2229.                     Else
  2230.                         iARGB1 = Cast(Integer Ptr, tBitmapData.Scan0)[y1 * iW + iX]
  2231.                         iARGB2 = Cast(Integer Ptr, tBitmapData.Scan0)[y2 * iW + iX]
  2232.                         fCounterR += Filter(b) * (((iARGB1 Shr 16) And &hFF) + ((iARGB2 Shr 16) And &hFF))
  2233.                         fCounterG += Filter(b) * (((iARGB1 Shr 8) And &hFF) + ((iARGB2 Shr 8) And &hFF))
  2234.                         fCounterB += Filter(b) * ((iARGB1 And &hFF) + (iARGB2 And &hFF))
  2235.                     EndIf
  2236.                 Next
  2237.                
  2238.                 newR = Int(fCounterR / fDominator)
  2239.                 newG = Int(fCounterG / fDominator)
  2240.                 newB = Int(fCounterB / fDominator)
  2241.                
  2242.                 newR = IIf(newR < 0, 0, IIf(newR > 255, 255, newR))
  2243.                 newG = IIf(newG < 0, 0, IIf(newG > 255, 255, newG))
  2244.                 newB = IIf(newB < 0, 0, IIf(newB > 255, 255, newB))
  2245.                
  2246.                 Cast(Integer Ptr, tBitmapData_TiltShift.Scan0)[iOffset + iX] = &hFF000000 + (newR Shl 16) + (newG Shl 8) + newB
  2247.             End If
  2248.         Next
  2249.     Next
  2250.    
  2251.    
  2252.     GdipBitmapUnlockBits(hBitmap_TiltShift, @tBitmapData_TiltShift)
  2253.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  2254.     If bGDI Then
  2255.         GdipCreateHBITMAPFromBitmap(hBitmap_TiltShift, @hGDIBitmap, &hFF000000)
  2256.         GdipDisposeImage(hBitmap_TiltShift)
  2257.         Return hGDIBitmap
  2258.     EndIf
  2259.     Return hBitmap_TiltShift
  2260. End Function
  2261.  
  2262. Function _GDIPlus_BitmapApplyFilter_RadialBlur(ByVal hImage As Any Ptr, fPosX As Single, fPosY As Single, fRadius As Single, iIntensity As UByte, bGDI As Bool) As Any Ptr Export 'based on original code by Jakub Szymanowski
  2263.     Dim As Single iW, iH, fCounterR, fCounterG, fCounterB, fDominator
  2264.     Dim as Double gauss, L, S, H, V, R, sigma
  2265.     Dim As Any Ptr hBitmap_RadialBlur, hGDIBitmap
  2266.     Dim As BitmapData tBitmapData, tBitmapData_RadialBlur
  2267.     Dim As Integer iStatus, iX, iY, k, b, y, y1, y2, newR, newG, newB, c, iARGB, iARGB1, iARGB2, iOffset
  2268.  
  2269.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  2270.     If iStatus <> 0 Then Return 0
  2271.    
  2272.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  2273.    
  2274.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_RadialBlur)
  2275.     GdipBitmapLockBits(hBitmap_RadialBlur, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_RadialBlur)
  2276.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  2277.    
  2278.     L = 0.15 'is defined function value for blurring in close proximity to sharp part (ex. in range 0.05 - 0.15)
  2279.     S = 6.0 'is defined function value for blurring in far proximity to sharp part (ex. in range 5 - 7)
  2280.     Dim Filter(0 To iIntensity) As Double
  2281.    
  2282.     For iY = 0 To iH - 1
  2283.         iOffset = iY * iW
  2284.         For iX = 0 To iW - 1
  2285.             H = Abs(iX - fPosX)
  2286.          V = Abs(iY - fPosY)
  2287.          R = Sqr(H * H + V * V)
  2288.             If R < fRadius Then
  2289.                 Cast(Integer Ptr, tBitmapData_RadialBlur.Scan0)[iOffset + iX] = Cast(Integer Ptr, tBitmapData.Scan0)[iOffset + iX]
  2290.             Else
  2291.                 sigma = L  + (S - L) * R / (2 * fRadius)
  2292.                
  2293.                 c = 0
  2294.                 For k = 0 To iIntensity - 1
  2295.                     gauss = (1 / (fPiSqr * sigma)) * Exp((-k * k) / (2 * sigma * sigma))
  2296.                     If Not (gauss < 0.003) Then
  2297.                         Filter(c) = gauss
  2298.                         c += 1
  2299.                     EndIf  
  2300.                 Next
  2301.                 iARGB = Cast(Integer Ptr, tBitmapData.Scan0)[iOffset + iX]
  2302.                 fCounterR = Filter(0) * ((iARGB Shr 16) And &hFF)
  2303.                 fCounterG = Filter(0) * ((iARGB Shr 8) And &hFF)
  2304.                 fCounterB = Filter(0) * (iARGB And &hFF)
  2305.                 fDominator = Filter(0)
  2306.                 For b = 1 To c - 1
  2307.                     fDominator += 2 * Filter(b)
  2308.                     y1 = iY - b
  2309.                     y2 = iY + b
  2310.                     If y1 < 0 Then
  2311.                         y1 = Abs(y1)
  2312.                     ElseIf y2 >= iH Then
  2313.                         y2 = y2 + b - iH + 1
  2314.                     Else
  2315.                         iARGB1 = Cast(Integer Ptr, tBitmapData.Scan0)[y1 * iW + iX]
  2316.                         iARGB2 = Cast(Integer Ptr, tBitmapData.Scan0)[y2 * iW + iX]
  2317.                         fCounterR += Filter(b) * (((iARGB1 Shr 16) And &hFF) + ((iARGB2 Shr 16) And &hFF))
  2318.                         fCounterG += Filter(b) * (((iARGB1 Shr 8) And &hFF) + ((iARGB2 Shr 8) And &hFF))
  2319.                         fCounterB += Filter(b) * ((iARGB1 And &hFF) + (iARGB2 And &hFF))
  2320.                     EndIf
  2321.                 Next
  2322.                
  2323.                 newR = Int(fCounterR / fDominator)
  2324.                 newG = Int(fCounterG / fDominator)
  2325.                 newB = Int(fCounterB / fDominator)
  2326.                
  2327.                 newR = IIf(newR < 0, 0, IIf(newR > 255, 255, newR))
  2328.                 newG = IIf(newG < 0, 0, IIf(newG > 255, 255, newG))
  2329.                 newB = IIf(newB < 0, 0, IIf(newB > 255, 255, newB))
  2330.                
  2331.                 Cast(Integer Ptr, tBitmapData_RadialBlur.Scan0)[iOffset + iX] = &hFF000000 + (newR Shl 16) + (newG Shl 8) + newB
  2332.             End If
  2333.         Next
  2334.     Next
  2335.    
  2336.    
  2337.     GdipBitmapUnlockBits(hBitmap_RadialBlur, @tBitmapData_RadialBlur)
  2338.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  2339.     If bGDI Then
  2340.         GdipCreateHBITMAPFromBitmap(hBitmap_RadialBlur, @hGDIBitmap, &hFF000000)
  2341.         GdipDisposeImage(hBitmap_RadialBlur)
  2342.         Return hGDIBitmap
  2343.     EndIf
  2344.     Return hBitmap_RadialBlur
  2345. End Function
  2346.  
  2347. Function _GDIPlus_BitmapApplyFilter_TimeWarp(ByVal hImage As Any Ptr, fFactor As Single, fMidX As Single, fMidY As Single, bGDI As Bool) As Any Ptr Export 'based on original code on https://www.programmingalgorithms.com/algorithm/time-warp
  2348.     Dim As Single iW, iH
  2349.     Dim As Integer iStatus
  2350.     Dim As Any Ptr hBitmap_TimeWarp, hGDIBitmap
  2351.     Dim As BitmapData tBitmapData, tBitmapData_TimeWarp
  2352.    
  2353.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  2354.     If iStatus <> 0 Then Return 0
  2355.    
  2356.    
  2357.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  2358.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_TimeWarp)
  2359.     GdipBitmapLockBits(hBitmap_TimeWarp, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_TimeWarp)
  2360.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  2361.    
  2362.     Dim As Integer iX, iY, iTrueX, iTrueY, iNewX, iNewY, iOffset
  2363.     Dim As Double fNewRadius, fTheta, fRadius
  2364.    
  2365.     For iY = 0 To iH - 1
  2366.         iOffset = iY * iW
  2367.         iTrueY = iY - fMidY
  2368.         For iX = 0 To iW - 1
  2369.             iTrueX = iX - fMidX
  2370.             fTheta = ATan2(iTrueY, iTrueX)
  2371.             fRadius = Sqr(iTrueX * iTrueX + iTrueY * iTrueY)
  2372.             fNewRadius = Sqr(fRadius) * fFactor
  2373.             iNewX = CLng(fMidX + (fNewRadius * Cos(fTheta)))
  2374.             iNewY = CLng(fMidY + (fNewRadius * Sin(fTheta)))
  2375.             If (iNewY >= 0 And iNewY < iH) And (iNewX >= 0 And iNewX < iW) Then
  2376.                 Cast(Integer Ptr, tBitmapData_TimeWarp.Scan0)[iOffset + iX] = Cast(Integer Ptr, tBitmapData.Scan0)[iNewY * iW + iNewX]
  2377.             EndIf
  2378.         Next
  2379.     Next
  2380.     GdipBitmapUnlockBits(hBitmap_TimeWarp, @tBitmapData_TimeWarp)
  2381.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  2382.    
  2383.     If bGDI Then
  2384.         GdipCreateHBITMAPFromBitmap(hBitmap_TimeWarp, @hGDIBitmap, &hFF000000)
  2385.         GdipDisposeImage(hBitmap_TimeWarp)
  2386.         Return hGDIBitmap
  2387.     EndIf
  2388.     Return hBitmap_TimeWarp
  2389. End Function
  2390.  
  2391. Function _GDIPlus_BitmapApplyFilter_FishEye(ByVal hImage As Any Ptr, bGDI As Bool) As Any Ptr Export 'based on original code by Christian Graus on http://www.codeproject.com/Articles/3419/Image-Processing-for-Dummies-with-C-and-GDI-Part
  2392.     Dim As Single iW, iH
  2393.     Dim As Integer iStatus
  2394.     Dim As Any Ptr hBitmap_FishEye, hGDIBitmap
  2395.     Dim As BitmapData tBitmapData, tBitmapData_FishEye
  2396.    
  2397.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  2398.     If iStatus <> 0 Then Return 0
  2399.    
  2400.    
  2401.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  2402.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_FishEye)
  2403.     GdipBitmapLockBits(hBitmap_FishEye, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_FishEye)
  2404.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  2405.    
  2406.     Dim As Integer i, iX, iY, iTrueX, iTrueY, iNewX, iNewY, iOffset
  2407.     Dim As Double fTheta, fRadius, fMidX, fMidY, fNewRadius
  2408.     fMidX = iW / 2
  2409.     fMidY = iH / 2
  2410.     Dim As Single fMaxXY
  2411.     fMaxXY = Max(fMidX, fMidY)
  2412.    
  2413.     For iY = 0 To iH - 1
  2414.         iOffset = iY * iW
  2415.         iTrueY = iY - fMidY 'translate to center y
  2416.         For iX = 0 To iW - 1
  2417.             iTrueX = iX - fMidX 'translate to center x
  2418.             fTheta = ATan2(iTrueY, iTrueX)
  2419.             fRadius = Sqr(iTrueX * iTrueX + iTrueY * iTrueY)
  2420.             fNewRadius = fRadius * fRadius / fMaxXY
  2421.             iNewX = fMidX + (fNewRadius * Cos(fTheta))
  2422.             iNewY = fMidY + (fNewRadius * Sin(fTheta))
  2423.             If Not (iNewY >= 0 And iNewY < iH) And (iNewX >= 0 And iNewX < iW) then
  2424.                 iNewX = 0
  2425.                 iNewY = 0
  2426.             EndIf
  2427.             If (iNewY >= 0 And iNewY < iH) And (iNewX >= 0 And iNewX < iW) Then
  2428.                 Cast(Integer Ptr, tBitmapData_FishEye.Scan0)[iOffset + iX] = Cast(Integer Ptr, tBitmapData.Scan0)[iNewY * iW + iNewX]
  2429.             EndIf
  2430.         Next
  2431.     Next
  2432.     GdipBitmapUnlockBits(hBitmap_FishEye, @tBitmapData_FishEye)
  2433.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  2434.    
  2435.     If bGDI Then
  2436.         GdipCreateHBITMAPFromBitmap(hBitmap_FishEye, @hGDIBitmap, &hFF000000)
  2437.         GdipDisposeImage(hBitmap_FishEye)
  2438.         Return hGDIBitmap
  2439.     EndIf
  2440.     Return hBitmap_FishEye
  2441. End Function
  2442.  
  2443. Function _GDIPlus_BitmapApplyFilter_Wave(ByVal hImage As Any Ptr, fAmplitudeX As Single, fAmplitudeY As Single, fFrequencyX As Single, fFrequencyY As Single, bGDI As Bool) As Any Ptr Export 'based on original code by Christian Graus on http://www.codeproject.com/Articles/3419/Image-Processing-for-Dummies-with-C-and-GDI-Part
  2444.     Dim As Single iW, iH
  2445.     Dim As Integer iStatus
  2446.     Dim As Any Ptr hBitmap_Wave, hGDIBitmap
  2447.     Dim As BitmapData tBitmapData, tBitmapData_Wave
  2448.    
  2449.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  2450.     If iStatus <> 0 Then Return 0
  2451.    
  2452.    
  2453.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  2454.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Wave)
  2455.     GdipBitmapLockBits(hBitmap_Wave, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Wave)
  2456.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  2457.    
  2458.     Dim As Integer i, iX, iY, iTrueX, iTrueY, iNewX, iNewY, iOffset
  2459.    
  2460.     For iY = 0 To iH - 1
  2461.         iOffset = iY * iW
  2462.         iTrueX = fAmplitudeX * Sin(f2Pi * iY / fFrequencyX)
  2463.         For iX = 0 To iW - 1
  2464.             iTrueY = fAmplitudeY * Cos(f2Pi * iX / fFrequencyY)
  2465.             iNewX = iX + iTrueX
  2466.             iNewY = iY + iTrueY
  2467.             If (iNewY >= 0 And iNewY < iH) And (iNewX >= 0 And iNewX < iW) Then
  2468.                 Cast(Integer Ptr, tBitmapData_Wave.Scan0)[iOffset + iX] = Cast(Integer Ptr, tBitmapData.Scan0)[iNewY * iW + iNewX]
  2469.             EndIf
  2470.         Next
  2471.     Next
  2472.     GdipBitmapUnlockBits(hBitmap_Wave, @tBitmapData_Wave)
  2473.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  2474.    
  2475.     If bGDI Then
  2476.         GdipCreateHBITMAPFromBitmap(hBitmap_Wave, @hGDIBitmap, &hFF000000)
  2477.         GdipDisposeImage(hBitmap_Wave)
  2478.         Return hGDIBitmap
  2479.     EndIf
  2480.     Return hBitmap_Wave
  2481. End Function
  2482.  
  2483. Function _GDIPlus_BitmapApplyFilter_Swirl(ByVal hImage As Any Ptr, fDegree As Single, bGDI As Bool) As Any Ptr Export 'based on original code by Christian Graus on http://www.codeproject.com/Articles/3419/Image-Processing-for-Dummies-with-C-and-GDI-Part
  2484.     Dim As Single iW, iH
  2485.     Dim As Integer iStatus
  2486.     Dim As Any Ptr hBitmap_Swirl, hGDIBitmap
  2487.     Dim As BitmapData tBitmapData, tBitmapData_Swirl
  2488.    
  2489.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  2490.     If iStatus <> 0 Then Return 0
  2491.    
  2492.    
  2493.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  2494.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Swirl)
  2495.     GdipBitmapLockBits(hBitmap_Swirl, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Swirl)
  2496.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  2497.    
  2498.     Dim As Integer i, iX, iY, iTrueX, iTrueY, iNewX, iNewY, iOffset
  2499.     Dim As Double fTheta, fRadius, fMidX, fMidY, f
  2500.     fMidX = iW / 2
  2501.     fMidY = iH / 2
  2502.    
  2503.     For iY = 0 To iH - 1
  2504.         iOffset = iY * iW
  2505.         iTrueY = iY - fMidY 'translate to center y
  2506.         For iX = 0 To iW - 1
  2507.             iTrueX = iX - fMidX 'translate to center x
  2508.             fTheta = ATan2(iTrueY, iTrueX)
  2509.             fRadius = Sqr(iTrueX * iTrueX + iTrueY * iTrueY)
  2510.             f = fTheta + fDegree * fRad * fRadius
  2511.             iNewX = fMidX + (fRadius * Cos(f))
  2512.             iNewY = fMidY + (fRadius * Sin(f))
  2513.             If (iNewY >= 0 And iNewY < iH) And (iNewX >= 0 And iNewX < iW) Then
  2514.                 Cast(Integer Ptr, tBitmapData_Swirl.Scan0)[iOffset + iX] = Cast(Integer Ptr, tBitmapData.Scan0)[iNewY * iW + iNewX]
  2515.             EndIf
  2516.         Next
  2517.     Next
  2518.     GdipBitmapUnlockBits(hBitmap_Swirl, @tBitmapData_Swirl)
  2519.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  2520.    
  2521.     If bGDI Then
  2522.         GdipCreateHBITMAPFromBitmap(hBitmap_Swirl, @hGDIBitmap, &hFF000000)
  2523.         GdipDisposeImage(hBitmap_Swirl)
  2524.         Return hGDIBitmap
  2525.     EndIf
  2526.    
  2527.     Return hBitmap_Swirl
  2528. End Function
  2529.  
  2530. Function _GDIPlus_BitmapApplyFilter_XRay(ByVal hImage As Any Ptr, iBias As Byte, bInvert As Bool, bGDI As Bool) As Any Ptr Export 'based on original code by Dewald Esterhuizen (DifferenceOfGaussians)
  2531.     Dim As Any Ptr hBitmap_XRay, hBitmap_Gaussian3x3, hBitmap_Gaussian5x5, hBitmap_Greyscale, hGDIBitmap
  2532.    
  2533.     hBitmap_Greyscale = _GDIPlus_BitmapCreateGreyscale(hImage)
  2534.     hBitmap_Gaussian3x3 = _GDIPlus_BitmapApplyFilter_Convolution(hBitmap_Greyscale, 1, 0, 31, 0, 0, 0)
  2535.     hBitmap_Gaussian5x5 = _GDIPlus_BitmapApplyFilter_Convolution(hBitmap_Greyscale, 1, 0, 28, 0, 0, 0)
  2536.     hBitmap_XRay = _GDIPlus_BitmapCreateSubtract(hBitmap_Gaussian3x3, hBitmap_Gaussian5x5, iBias, bInvert)
  2537.    
  2538.     GdipDisposeImage(hBitmap_Greyscale)
  2539.     GdipDisposeImage(hBitmap_Gaussian3x3)
  2540.     GdipDisposeImage(hBitmap_Gaussian5x5)
  2541.    
  2542.     If bGDI Then
  2543.         GdipCreateHBITMAPFromBitmap(hBitmap_XRay, @hGDIBitmap, &hFF000000)
  2544.         GdipDisposeImage(hBitmap_XRay)
  2545.         Return hGDIBitmap
  2546.     EndIf
  2547.     Return hBitmap_XRay
  2548. End Function
  2549.  
  2550. Function _GDIPlus_BitmapApplyFilter_DistortionBlur(ByVal hImage As Any Ptr, iDistortFactor As UShort, bGDI As Bool) As Any Ptr Export 'based on original code by Dewald Esterhuizen
  2551.     Dim As Single iW, iH
  2552.     Dim As Any Ptr hBitmap_Distortion, hBitmap_Blur, hGDIBitmap
  2553.     Dim As Integer iStatus
  2554.     Dim As BitmapData tBitmapData, tBitmapData_Distortion
  2555.    
  2556.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  2557.     If iStatus <> 0 Then Return 0
  2558.    
  2559.     Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  2560.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Distortion)
  2561.     GdipBitmapLockBits(hBitmap_Distortion, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Distortion)
  2562.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  2563.    
  2564.     GdipBitmapUnlockBits(hBitmap_Distortion, @tBitmapData_Distortion)
  2565.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  2566.    
  2567.     Dim As Integer iX, iY, iOffset, filterX, filterY, factorMax
  2568.    
  2569.     iDistortFactor = IIf(iDistortFactor < 2, 2, iDistortFactor)
  2570.    
  2571.     factorMax = (iDistortFactor + 1) * 2
  2572.    
  2573.     For iY = 0 To iH - 1
  2574.         iOffset = iY * iW
  2575.         For iX = 0 To iW - 1
  2576.             filterX = Int(iX + iDistortFactor - Rnd * factorMax) Mod iW
  2577.             filterY = Int(iY + iDistortFactor - Rnd * factorMax) Mod iH
  2578.         If filterX < 0 Then filterX = 0
  2579.         If filterY < 0 Then filterY = 0
  2580.         Cast(Integer Ptr, tBitmapData_Distortion.Scan0)[iOffset + iX] = Cast(Integer Ptr, tBitmapData.Scan0)[filterY * iW + filterX]
  2581.         Next
  2582.     Next
  2583.    
  2584.     GdipBitmapUnlockBits(hBitmap_Distortion, @tBitmapData_Distortion)
  2585.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  2586.    
  2587.     hBitmap_Blur = _GDIPlus_BitmapApplyFilter_Convolution(hBitmap_Distortion, 1, 0, 17, 0, 0, 0)
  2588.    
  2589.     GdipDisposeImage(hBitmap_Distortion)
  2590.    
  2591.     If bGDI Then
  2592.         GdipCreateHBITMAPFromBitmap(hBitmap_Blur, @hGDIBitmap, &hFF000000)
  2593.         GdipDisposeImage(hBitmap_Blur)
  2594.         Return hGDIBitmap
  2595.     EndIf
  2596.    
  2597.     Return hBitmap_Blur
  2598. End Function
  2599.  
  2600. Function _GDIPlus_BitmapApplyFilter_GridBlur(ByVal hImage As Any Ptr, bGDI As Bool) As Any Ptr Export
  2601.     Dim As Single iW, iH
  2602.     Dim As Any Ptr hBitmap_GridBlur, hGDIBitmap
  2603.     Dim As BitmapData tBitmapData, tBitmapData_GridBlur
  2604.     Dim As Long iX, iY, iRowOffset, r, g, b, iColor
  2605.     Dim As Integer iStatus
  2606.  
  2607.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  2608.     If iStatus <> 0 Then Return 0
  2609.    
  2610.     Dim As Rect tRect_GridBlur = Type(0, 0, iW - 1, iH - 1), tRect = Type(0, 0, iW - 1, iH - 1)
  2611.    
  2612.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_GridBlur)
  2613.     GdipBitmapLockBits(hBitmap_GridBlur, Cast(Any Ptr, @tRect_GridBlur), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_GridBlur)
  2614.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  2615.    
  2616.     Dim As UInteger rax(0 To iW), gax(0 To iW), bax(0 To iW), ray(0 To iH), gay(0 To iH), bay(0 To iH), iPixels = iW + iH
  2617.    
  2618.     For iX = 0 To iW - 1
  2619.         r = 0
  2620.         g = 0
  2621.         b = 0
  2622.         For iY = 0 To iH - 1
  2623.           iColor = Cast(Integer Ptr, tBitmapData.Scan0)[iY * iW + iX]
  2624.             b += (iColor Shr 16) And &hFF
  2625.             g += (iColor Shr 8) And &hFF
  2626.             r += iColor And &hFF
  2627.         Next
  2628.         rax(iX) = r
  2629.         gax(iX) = g
  2630.         bax(iX) = b
  2631.     Next
  2632.        
  2633.     For iY = 0 To iH - 1
  2634.         iRowOffset = iY * iW
  2635.         r = 0
  2636.         g = 0
  2637.         b = 0
  2638.         For iX = 0 To iW - 1
  2639.           iColor = Cast(Integer Ptr, tBitmapData.Scan0)[iRowOffset + iX]
  2640.             r += (iColor Shr 16) And &hFF
  2641.             g += (iColor Shr 8) And &hFF
  2642.             b += iColor And &hFF
  2643.         Next
  2644.         ray(iY) = r
  2645.         gay(iY) = g
  2646.         bay(iY) = b
  2647.     Next
  2648.    
  2649.     For iY = 0 To iH - 1
  2650.         iRowOffset = iY * iW
  2651.         For iX = 0 To iW - 1
  2652.             r = Int((rax(iX) + ray(iY)) / iPixels)
  2653.             If r > 255 Then r = 255
  2654.             g = Int((gax(iX) + gay(iY)) / iPixels)
  2655.             If g > 255 Then g = 255
  2656.             b = Int((bax(iX) + bay(iY)) / iPixels)
  2657.             If b > 255 Then b = 255
  2658.             Cast(Integer Ptr, tBitmapData_GridBlur.Scan0)[iRowOffset + iX] = &hFF000000 + r Shl 16 + g Shl 8 + b
  2659.         Next
  2660.     Next
  2661.            
  2662.     GdipBitmapUnlockBits(hBitmap_GridBlur, @tBitmapData_GridBlur)
  2663.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  2664.     If bGDI Then
  2665.         GdipCreateHBITMAPFromBitmap(hBitmap_GridBlur, @hGDIBitmap, &hFF000000)
  2666.         GdipDisposeImage(hBitmap_GridBlur)
  2667.         Return hGDIBitmap
  2668.     EndIf
  2669.     Return hBitmap_GridBlur    
  2670. End Function
  2671.  
  2672. 'Jarvis, Judice, and Ninke Dithering
  2673. Function _GDIPlus_BitmapApplyFilter_BWJJNDithering(ByVal hImage As Any Ptr, fErrorMultiplier As Single, iThreshold As UByte, bGDI As Bool) As Any Ptr Export
  2674.     Dim As Single iW, iH
  2675.     Dim As Integer iStatus
  2676.    
  2677.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  2678.     If iStatus <> 0 Then Return 0
  2679.    
  2680.     Dim As Any Ptr hBitmap_Dithered, hGDIBitmap
  2681.     Dim As BitmapData tBitmapData, tBitmapData_Dithered
  2682.     Dim As Long iX, iY, xx, yy, iRowOffset, r, g, b, e, fAvg, iARGB
  2683.     Dim As Single aError(0 To iH, 0 To iW)
  2684.     Dim As Rect tRect_Dithered = Type(0, 0, iW - 1, iH - 1), tRect = Type(0, 0, iW - 1, iH - 1)
  2685.    
  2686.     GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Dithered)
  2687.     GdipBitmapLockBits(hBitmap_Dithered, Cast(Any Ptr, @tRect_Dithered), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Dithered)
  2688.     GdipBitmapLockBits(hImage, Cast(Any Ptr, @tRect), ImageLockModeRead, PixelFormat32bppARGB, @tBitmapData)
  2689.    
  2690.    Dim aFilter(0 To 3, 0 To 5) As Single  = {{0,        0,          0,          7/48,       5/48}, _
  2691.                                              {3/48, 5/48,       7/48,       5/48,       3/48}, _
  2692.                                              {1/48, 3/48,       5/48,       3/48,       1/48}}
  2693.                                                      
  2694.     For iY = 0 To iH - 1
  2695.         iRowOffset = iY * iW
  2696.         For iX = 0 To iW - 1
  2697.           iARGB = Cast(Integer Ptr, tBitmapData.Scan0)[iRowOffset + iX]
  2698.             r = (iARGB Shr 16) And &hFF
  2699.             g = (iARGB Shr 8) And &hFF
  2700.             b = iARGB And &hFF
  2701.             'fAvg = (r + g + b) / 3
  2702.             fAvg = (r * 213 + g * 715 + b * 72) / 1000
  2703.             fAvg -= aError(iY, iX) * fErrorMultiplier
  2704.             e = 0
  2705.             If fAvg < iThreshold Then
  2706.                 e = -fAvg
  2707.                 fAvg = 0
  2708.             Else
  2709.                 e = 255 - fAvg
  2710.                 fAvg = 255
  2711.             EndIf
  2712.             For yy = 0 To 2
  2713.                 For xx = -2 To 2
  2714.                     If (iY + yy < 0) Or (iH <= iY + yy) Or (iX + xx < 0) Or (iW <= iX + xx) Then Continue For
  2715.                     aError(iY + yy, iX + xx) += e * aFilter(yy, xx + 2)
  2716.                 Next
  2717.             Next
  2718.             Cast(Integer Ptr, tBitmapData_Dithered.Scan0)[iRowOffset + iX] = &hFF000000 + (fAvg Shl 16) + (fAvg Shl 8) + (fAvg Shl 0)
  2719.         Next
  2720.     Next
  2721.     GdipBitmapUnlockBits(hBitmap_Dithered, @tBitmapData_Dithered)
  2722.     GdipBitmapUnlockBits(hImage, @tBitmapData)
  2723.     If bGDI Then
  2724.         GdipCreateHBITMAPFromBitmap(hBitmap_Dithered, @hGDIBitmap, &hFF000000)
  2725.         GdipDisposeImage(hBitmap_Dithered)
  2726.         Return hGDIBitmap
  2727.     EndIf
  2728.     Return hBitmap_Dithered
  2729. End Function
  2730.  
  2731. 'https://www.cyotek.com/blog/dithering-an-image-using-the-floyd-steinberg-algorithm-in-csharp
  2732. Function _GDIPlus_BitmapApplyFilter_Indexed(ByVal hImage As Any Ptr, iColors As ULong, bDither As Bool, iDiv As UByte, errorMode As UByte, bGDI As Bool) As Any Ptr Export
  2733.     Dim As Single iW, iH
  2734.     Dim As Integer iStatus
  2735.     iStatus = GdipGetImageDimension(hImage, @iW, @iH)
  2736.     If iStatus <> 0 Then Return 0
  2737.    
  2738.     Dim As Integer iFormat
  2739.     Select Case iColors
  2740.         Case 2 '1 bit
  2741.             iFormat = PixelFormat1bppIndexed
  2742.         Case 16 '4 bit
  2743.             iFormat = PixelFormat4bppIndexed
  2744.         Case 256 '8 bit
  2745.             iFormat = PixelFormat8bppIndexed
  2746.         Case Else
  2747.             iFormat = PixelFormat8bppIndexed
  2748.             iColors = 256
  2749.     End Select
  2750.    
  2751.     Dim As Any Ptr hBitmap_temp, hBitmap_Indexed, hGDIBitmap
  2752.     Dim As UInteger iBytes
  2753.     Dim tPalette As tagPalette
  2754.        
  2755.     GdipCloneBitmapArea(0, 0, iW, iH, iFormat, hImage, @hBitmap_temp)
  2756.     GdipGetImagePaletteSize(hBitmap_temp, @iBytes)
  2757.     GdipGetImagePalette(hBitmap_temp, @tPalette, iBytes)
  2758.    
  2759.     If bDither Then
  2760.         GdipDisposeImage(hBitmap_temp)
  2761.         GdipCloneBitmapArea(0, 0, iW, iH, PixelFormat32bppARGB, hImage, @hBitmap_temp)
  2762.         Dim As UInteger iX, iY, iRowOffset, currentPixel, NearestColor, c
  2763.         Dim As UByte errorR, errorG, errorB, iR, iG, iB
  2764.         Dim As BitmapData tBitmapData, tBitmapData_Index
  2765.         Dim As Rect tRect = Type(0, 0, iW - 1, iH - 1)
  2766.         GdipCreateBitmapFromScan0(iW, iH, 0, PixelFormat32bppARGB, 0, @hBitmap_Indexed)
  2767.         GdipBitmapLockBits(hBitmap_Indexed, Cast(Any Ptr, @tRect), ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData_Index)
  2768.         GdipBitmapLockBits(hBitmap_temp, Cast(Any Ptr, @tRect), ImageLockModeRead Or ImageLockModeWrite, PixelFormat32bppARGB, @tBitmapData)
  2769.         iDiv = IIf(iDiv < 3, 3, IIf(iDiv > 10, 10, iDiv))
  2770.         errorMode = IIf(errorMode < 1, 1, IIf(errorMode > 2, 2, errorMode))
  2771.        
  2772.         For iY = 0 To iH - 1
  2773.             iRowOffset = iY * iW
  2774.             For iX = 0 To iW - 1
  2775.               currentPixel = Cast(Integer Ptr, tBitmapData.Scan0)[iRowOffset + iX]
  2776.               iR = (currentPixel Shr 16) And &hFF
  2777.                 iG = (currentPixel Shr 8) And &hFF
  2778.                 iB =  currentPixel And &hFF
  2779.                 NearestColor = FindNearestColor(currentPixel, @tPalette, iColors)
  2780.                 Cast(Integer Ptr, tBitmapData_Index.Scan0)[iRowOffset + iX] = NearestColor
  2781.                
  2782.                 Select Case errorMode
  2783.                     Case 1
  2784.                         errorR = iR - ((NearestColor Shr 16) And &hFF)
  2785.                         errorG = iG - ((NearestColor Shr 8) And &hFF)
  2786.                         errorB = iB -  (NearestColor And &hFF)
  2787.                     Case 2
  2788.                         'Euclidean distance -> SQR((r1 - r2)² + (g1 - g2)² + (b1 - b2)²)
  2789.                         errorR = Sqr(iR * iR - ((NearestColor Shr 16) And &hFF) * ((NearestColor Shr 16) And &hFF))
  2790.                         errorG = Sqr(iG * iG - ((NearestColor Shr 8) And &hFF) *  ((NearestColor Shr 8) And &hFF))
  2791.                         errorB = Sqr(iB * iB -  (NearestColor And &hFF) *             (NearestColor And &hFF))
  2792.                 End Select
  2793.                
  2794.                 If (iX + 1) < (iW - 1) Then
  2795.                     c = Cast(Integer Ptr, tBitmapData.Scan0)[iY * iW + (iX + 1)] 'right
  2796.                   iR = PlusTruncate((c Shr 16) And &hFF, (errorR * 7) Shr iDiv)
  2797.                     iG = PlusTruncate((c Shr 8) And &hFF,  (errorG * 7) Shr iDiv)
  2798.                     iB = PlusTruncate( c And &hFF,         (errorB * 7) Shr iDiv)
  2799.                     Cast(Integer Ptr, tBitmapData.Scan0)[(iY * iW) + (iX + 1)] = &hFF000000 + (iR Shl 16) + (iG Shl 8) + iB
  2800.                 EndIf
  2801.                 If iY + 1 < iH - 1 Then
  2802.                     If iX - 1 > 0 Then
  2803.                         c = Cast(Integer Ptr, tBitmapData.Scan0)[(iY + 1) * iW + iX - 1] 'left and down
  2804.                       iR = PlusTruncate((c Shr 16) And &hFF, (errorR * 3) Shr iDiv)
  2805.                         iG = PlusTruncate((c Shr 8) And &hFF,  (errorG * 3) Shr iDiv)
  2806.                         iB = PlusTruncate( c And &hFF,         (errorB * 3) Shr iDiv)
  2807.                         Cast(Integer Ptr, tBitmapData.Scan0)[(iY + 1) * iW + iX - 1] = &hFF000000 + (iR Shl 16) + (iG Shl 8) + iB
  2808.                     EndIf
  2809.                    
  2810.                     c = Cast(Integer Ptr, tBitmapData.Scan0)[(iY + 1) * iW + iX] 'down
  2811.                   iR = PlusTruncate((c Shr 16) And &hFF, (errorR * 5) Shr iDiv)
  2812.                     iG = PlusTruncate((c Shr 8) And &hFF,  (errorG * 5) Shr iDiv)
  2813.                     iB = PlusTruncate( c And &hFF,         (errorB * 5) Shr iDiv)
  2814.                     Cast(Integer Ptr, tBitmapData.Scan0)[(iY + 1) * iW + iX - 1] = &hFF000000 + (iR Shl 16) + (iG Shl 8) + iB
  2815.                    
  2816.                     If iX + 1 < iW - 1 Then
  2817.                         c = Cast(Integer Ptr, tBitmapData.Scan0)[(iY + 1) * iW + iX + 1] 'right and down
  2818.                       iR = PlusTruncate((c Shr 16) And &hFF, errorR Shr iDiv)
  2819.                         iG = PlusTruncate((c Shr 8) And &hFF,  errorG Shr iDiv)
  2820.                         iB = PlusTruncate( c And &hFF,         errorB Shr iDiv)
  2821.                         Cast(Integer Ptr, tBitmapData.Scan0)[(iY + 1) * iW + iX + 1] = &hFF000000 + (iR Shl 16) + (iG Shl 8) + iB                  
  2822.                     EndIf
  2823.                 EndIf  
  2824.             Next
  2825.         Next
  2826.        
  2827.         GdipBitmapUnlockBits(hBitmap_Indexed, @tBitmapData_Index)
  2828.         GdipBitmapUnlockBits(hBitmap_temp, @tBitmapData)
  2829.         If bGDI Then
  2830.             GdipCreateHBITMAPFromBitmap(hBitmap_Indexed, @hGDIBitmap, &hFF000000)
  2831.             GdipDisposeImage(hBitmap_Indexed)
  2832.             Return hGDIBitmap
  2833.         EndIf
  2834.         Return hBitmap_Indexed
  2835.     EndIf
  2836.     If bGDI Then
  2837.         GdipCreateHBITMAPFromBitmap(hBitmap_temp, @hGDIBitmap, &hFF000000)
  2838.         GdipDisposeImage(hBitmap_temp)
  2839.         Return hGDIBitmap
  2840.     EndIf
  2841.     Return hBitmap_temp
  2842. End Function
  2843.  
  2844. Function FindNearestColor(iColor As UInteger, ByRef tColorPalette As tagPalette Ptr, iColors As ULong) As UInteger
  2845.     Dim As UInteger minDistanceSquared = 255 * 255 + 255 * 255 + 255 * 255 + 1, distanceSquared, c
  2846.     Dim As UByte bestIndex = 0, Rdiff, Gdiff, Bdiff
  2847.     Dim As ULong i
  2848.     For i = 0 To iColors - 1
  2849.         c = tColorPalette->ARGB(i)
  2850.         Rdiff = ((iColor Shr 16) And &hFF) - ((c Shr 16) And &hFF)
  2851.         Gdiff = ((iColor Shr 8) And &hFF) - ((c Shr 8) And &hFF)
  2852.         Bdiff = (iColor And &hFF) - (c And &hFF)
  2853.         distanceSquared = Rdiff * Rdiff + Gdiff * Gdiff + Bdiff * Bdiff
  2854.         If distanceSquared < minDistanceSquared Then
  2855.             minDistanceSquared = distanceSquared
  2856.             bestIndex = i
  2857.         EndIf
  2858.     Next
  2859.     Return tColorPalette->ARGB(bestIndex)
  2860. End Function
  2861.  
  2862. Function PlusTruncate(a As UByte, b As Long) As UByte
  2863.     Return IIf(a + b < 0, 0, IIf(a + b > 255, 255, a + b))
  2864. End Function
  2865.  
  2866. End Extern
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top