UEZ

_GDIPlus_BitmapApplyFilter v0.9.7 build 2020-11-16 beta

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