home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 7_2009-2012.ISO / data / zips / EVOLVING_C220927892011.psc / cls / LineGS.cls < prev    next >
Text File  |  2011-06-15  |  33KB  |  1,054 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "LineGS"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
  15. Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
  16. Attribute VB_Ext_KEY = "Member0" ,"SmoothLineDIB"
  17. Option Explicit
  18.  
  19. 'Original TMT Pascal/Asm code by Jonas Widarsson
  20. '
  21. 'Implemented in Vb6 by Dana Seaman
  22. 'Send comments/bug reports to dseaman@ieg.com.br
  23. '
  24. 'REVISION HISTORY
  25. '26-Jan-2002 Created LineGP  Method
  26. '28-Jan-2002 Created LineDIB Method
  27. '........... Created Class
  28. '........... Optimized code
  29. '05-Apr-2002 First Release to PSC *(Deleted by Hacker)
  30. '09-Apr-2002 Improved speed, more comments and error handling
  31. '11-Apr-2002 Added 3D clock hands
  32. '12-Apr-2002 Improved clock timer event handler
  33. '14-Apr-2002 Added Circle/Ellipse draw
  34. '16-Apr-2002 Circle/Ellipse draw by Quadrants
  35. '19-Apr-2002 Changed to RGBQuad (easier to understand DIBits)
  36. '22-Apr-2002 Added circle thick/thin
  37. '26-Apr-2002 Pass hDC together with LineGP/CircleGp
  38. '........... Simplified blending code
  39. '........... Common SetRGBComponents Sub
  40. '28-Apr-2002 Added Arc drawing
  41. '........... Several tweaks/speedups
  42. '30-May-2002 Added Rounded Rectangle
  43. '01-Jun-2002 Bevel/3D Rounded Rectangle
  44. Public Enum cThickness
  45.     Thin
  46.     Thick
  47. End Enum
  48. Private Type RGBQUAD
  49.     Blue           As Byte
  50.     Green          As Byte
  51.     Red            As Byte
  52.     Reserved       As Byte
  53. End Type
  54.  
  55. Private Type BITMAPINFOHEADER
  56.     biSize         As Long
  57.     biWidth        As Long
  58.     biHeight       As Long
  59.     biPlanes       As Integer
  60.     biBitCount     As Integer
  61.     biCompression  As Long
  62.     biSizeImage    As Long
  63.     biXPelsPerMeter As Long
  64.     biYPelsPerMeter As Long
  65.     biClrUsed      As Long
  66.     biClrImportant As Long
  67. End Type
  68.  
  69. Private Type BITMAPINFO
  70.     bmiHeader      As BITMAPINFOHEADER
  71. End Type
  72.  
  73. Private Type RECT
  74.     Left           As Long
  75.     Top            As Long
  76.     Right          As Long
  77.     Bottom         As Long
  78. End Type
  79.  
  80. Private Const DIB_RGB_COLORS As Long = 0
  81. Private Const Pi   As Single = 3.141592
  82. Private Const HalfPi As Single = Pi / 2
  83. Private Const cThin As Single = Pi * 0.34
  84. Private Const cThick As Single = Pi * 0.17
  85. Private Const Rads As Single = Pi / 180
  86. Private Const PS_SOLID As Long = 0
  87.  
  88. Private Binfo      As BITMAPINFO
  89. Private buf()      As RGBQUAD
  90. Private InDIBits   As Boolean
  91. Private Red        As Long
  92. Private Green      As Long
  93. Private Blue       As Long
  94. Private m_Color    As Long
  95. Private m_hDC      As Long
  96. Private m_W1       As Long
  97. Private m_H1       As Long
  98. Private m_Handle   As Long
  99.  
  100. Private Declare Function Arc Lib "gdi32" (ByVal hdc As Long, ByVal x1 As Long, ByVal y1 As Long, ByVal x2 As Long, ByVal y2 As Long, ByVal X3 As Long, ByVal Y3 As Long, ByVal X4 As Long, ByVal Y4 As Long) As Long
  101. Private Declare Function OleTranslateColor Lib "olepro32.dll" (ByVal OLE_COLOR As Long, ByVal HPALETTE As Long, pccolorref As Long) As Long
  102. Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
  103. Private Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
  104. Private Declare Function GetDIBits Lib "gdi32" (ByVal hdc As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
  105. Private Declare Function SetDIBits Lib "gdi32" (ByVal hdc As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
  106.  
  107. 'Public Sub Widget(rct As RECT)
  108.  
  109. 'End Sub
  110. Private Function TranslateColour(ByVal clr As OLE_COLOR, _
  111.                                  Optional hPal As Long = 0) As Long
  112.     If OleTranslateColor(clr, hPal, TranslateColour) Then
  113.         TranslateColour = vbBlack    'CLR_INVALID
  114.     End If
  115. End Function
  116.  
  117. Public Sub DIB(ByVal hdc As Long, ByVal Handle As Long, ByVal W1 As Long, ByVal H1 As Long)
  118.     m_hDC = hdc
  119.     m_Handle = Handle
  120.     m_W1 = W1
  121.     m_H1 = H1
  122.     Pic2Array
  123. End Sub
  124.  
  125. Private Sub Pic2Array()
  126.  
  127.  
  128.     ReDim buf(0 To (m_W1 - 1), m_H1 - 1) As RGBQUAD
  129.     With Binfo.bmiHeader
  130.         .biSize = 40
  131.         .biWidth = m_W1
  132.         .biHeight = -m_H1
  133.         .biPlanes = 1
  134.         .biBitCount = 32
  135.         .biCompression = 0
  136.         .biClrUsed = 0
  137.         .biClrImportant = 0
  138.         .biSizeImage = m_W1 * m_H1
  139.     End With
  140.     'Copy hDC to Array
  141.     GetDIBits m_hDC, m_Handle, 0, m_H1, buf(0, 0), Binfo, DIB_RGB_COLORS
  142.     'Set local flag
  143.     InDIBits = True
  144. End Sub
  145.  
  146. Public Sub CircleGP(ByVal hdc As Long, _
  147.                     ByVal x1 As Long, _
  148.                     ByVal y1 As Long, _
  149.                     ByVal RadiusX As Long, _
  150.                     ByVal RadiusY As Long, _
  151.                     ByVal Color As OLE_COLOR, _
  152.                     Optional ByVal Thickness As cThickness = Thick)
  153.  
  154.     Dim Bbg        As Byte
  155.     Dim Gbg        As Byte
  156.     Dim Rbg        As Byte
  157.     Dim savAlpha(1 To 4) As Byte
  158.     Dim Bblend     As Long
  159.     Dim Bgr        As Long
  160.     Dim Cl         As Long
  161.     Dim Gblend     As Long
  162.     Dim Strength   As Long
  163.     Dim StrengthI  As Long
  164.     Dim Quadrant   As Long
  165.     Dim Radius     As Long
  166.     Dim Rblend     As Long
  167.     Dim RX1        As Long
  168.     Dim RX2        As Long
  169.     Dim RY1        As Long
  170.     Dim RY2        As Long
  171.     Dim savX(1 To 4) As Long
  172.     Dim savY(1 To 4) As Long
  173.     Dim X4         As Long
  174.     Dim Y4         As Long
  175.     Dim NewColor   As Long
  176.     Dim Ax         As Single
  177.     Dim Ay         As Single
  178.     Dim Bx         As Single
  179.     Dim By         As Single
  180.     Dim L1         As Single
  181.     Dim L2         As Single
  182.     Dim L3         As Single
  183.     Dim L4         As Single
  184.     Dim sngAngle   As Single
  185.     Dim sngPointSpacing As Single
  186.     Dim x2         As Single
  187.     Dim Xp5        As Single
  188.     Dim y2         As Single
  189.  
  190.     m_hDC = hdc
  191.  
  192.     SetRGBComponents Color
  193.  
  194.     Radius = RadiusX
  195.     If RadiusY > RadiusX Then
  196.         Radius = RadiusY
  197.     End If
  198.  
  199.     sngPointSpacing = GetPointSpacing(Radius, Thickness)
  200.  
  201.     For sngAngle = 0 To HalfPi Step sngPointSpacing
  202.         x2 = RadiusX * Cos(sngAngle)
  203.         y2 = RadiusY * Sin(sngAngle)
  204.         'Prevents error when vb rounds .5 down
  205.         If x2 = Int(x2) Then x2 = x2 + 0.001
  206.         If y2 = Int(y2) Then y2 = y2 + 0.001
  207.         For Quadrant = 0 To 3
  208.             Select Case Quadrant
  209.                 Case 0            '0-90░
  210.                     Ax = x2 + x1 - 0.5
  211.                     Ay = -y2 + y1 - 0.5
  212.                 Case 1            '90-180░
  213.                     Ax = x2 + x1 - 0.5
  214.                     Ay = y2 + y1 - 0.5
  215.                 Case 2            '180-270░
  216.                     Ax = -x2 + x1 - 0.5
  217.                     Ay = y2 + y1 - 0.5
  218.                 Case 3            '270-360░
  219.                     Ax = -x2 + x1 - 0.5
  220.                     Ay = -y2 + y1 - 0.5
  221.             End Select
  222.             Bx = Ax + 1
  223.             By = Ay + 1
  224.             RX1 = Ax
  225.             RX2 = RX1 + 1
  226.             Xp5 = RX1 + 0.5
  227.             RY1 = Ay
  228.             RY2 = By
  229.             L1 = RY1 + 0.5 - Ay
  230.             L2 = 256 * (Xp5 - Ax) - Xp5 + Ax
  231.             L3 = 255 - L2
  232.             L4 = By - RY2 + 0.5
  233.             savX(1) = RX1
  234.             savY(1) = RY1
  235.             savX(2) = RX2
  236.             savY(2) = RY1
  237.             savY(3) = RY2
  238.             savX(3) = RX1
  239.             savY(4) = RY2
  240.             savX(4) = RX2
  241.             savAlpha(1) = L1 * L2
  242.             savAlpha(2) = L1 * L3
  243.             savAlpha(3) = L4 * L2
  244.             savAlpha(4) = L4 * L3
  245.  
  246.             For Cl = 1 To 4
  247.                 Strength = savAlpha(Cl)
  248.                 X4 = savX(Cl)
  249.                 Y4 = savY(Cl)
  250.                 If Strength > 252 Then    '> 99%
  251.                     SetPixelV m_hDC, X4, Y4, Color
  252.                 Else
  253.                     Bgr = GetPixel(m_hDC, X4, Y4)
  254.                     If Bgr Then   'if not black
  255.                         Rbg = Bgr And &HFF&
  256.                         Gbg = (Bgr And &HFF00&) \ &H100&
  257.                         Bbg = (Bgr And &HFF0000) \ &H10000
  258.                     Else
  259.                         Rbg = 0
  260.                         Gbg = 0
  261.                         Bbg = 0
  262.                     End If
  263.                     StrengthI = 255 - Strength
  264.                     Rblend = StrengthI * Rbg + Strength * Red
  265.                     Gblend = StrengthI * Gbg + Strength * Green
  266.                     Bblend = StrengthI * Bbg + Strength * Blue
  267.                     NewColor = RGB(Rblend \ 256, Gblend \ 256, Bblend \ 256)
  268.                     SetPixelV m_hDC, X4, Y4, NewColor
  269.                 End If
  270.             Next
  271.         Next
  272.     Next
  273.  
  274. End Sub
  275.  
  276. Public Sub ArcGP(ByVal hdc As Long, _
  277.                  ByVal x1 As Long, _
  278.                  ByVal y1 As Long, _
  279.                  ByVal RadiusX As Long, _
  280.                  ByVal RadiusY As Long, _
  281.                  ByVal StartAngle As Single, _
  282.                  ByVal StopAngle As Single, _
  283.                  ByVal Color As OLE_COLOR, _
  284.                  Optional ByVal Thickness As cThickness = Thick)
  285.  
  286.     Dim Bbg        As Byte
  287.     Dim Gbg        As Byte
  288.     Dim Rbg        As Byte
  289.     Dim savAlpha(1 To 4) As Byte
  290.     Dim Bblend     As Long
  291.     Dim Bgr        As Long
  292.     Dim Cl         As Long
  293.     Dim Gblend     As Long
  294.     Dim Strength   As Long
  295.     Dim StrengthI  As Long
  296.     Dim Radius     As Long
  297.     Dim Rblend     As Long
  298.     Dim RX1        As Long
  299.     Dim RX2        As Long
  300.     Dim RY1        As Long
  301.     Dim RY2        As Long
  302.     Dim savX(1 To 4) As Long
  303.     Dim savY(1 To 4) As Long
  304.     Dim X4         As Long
  305.     Dim Y4         As Long
  306.     Dim NewColor   As Long
  307.     Dim Ax         As Single
  308.     Dim Ay         As Single
  309.     Dim Bx         As Single
  310.     Dim By         As Single
  311.     Dim L1         As Single
  312.     Dim L2         As Single
  313.     Dim L3         As Single
  314.     Dim L4         As Single
  315.     Dim sngAngle   As Single
  316.     Dim sngPointSpacing As Single
  317.     Dim x2         As Single
  318.     Dim Xp5        As Single
  319.     Dim y2         As Single
  320.  
  321.     m_hDC = hdc
  322.  
  323.     SetRGBComponents Color
  324.  
  325.     Radius = RadiusX
  326.     If RadiusY > RadiusX Then
  327.         Radius = RadiusY
  328.     End If
  329.  
  330.     sngPointSpacing = GetPointSpacing(Radius, Thickness)
  331.  
  332.     If StartAngle > StopAngle Then
  333.         StopAngle = StopAngle + 360
  334.     End If
  335.     'Convert to Radians
  336.     StartAngle = StartAngle * Rads
  337.     StopAngle = StopAngle * Rads
  338.  
  339.     For sngAngle = StartAngle To StopAngle Step sngPointSpacing
  340.         x2 = RadiusX * Cos(sngAngle - HalfPi)
  341.         y2 = RadiusY * Sin(sngAngle - HalfPi)
  342.         'Prevents error when vb rounds .5 down
  343.         If x2 = Int(x2) Then x2 = x2 + 0.001
  344.         If y2 = Int(y2) Then y2 = y2 + 0.001
  345.         Ax = x2 + x1 - 0.5
  346.         Ay = y2 + y1 - 0.5
  347.         Bx = Ax + 1
  348.         By = Ay + 1
  349.         RX1 = Ax
  350.         RX2 = RX1 + 1
  351.         Xp5 = RX1 + 0.5
  352.         RY1 = Ay
  353.         RY2 = By
  354.         L1 = RY1 + 0.5 - Ay
  355.         L2 = 256 * (Xp5 - Ax) - Xp5 + Ax
  356.         L3 = 255 - L2
  357.         L4 = By - RY2 + 0.5
  358.         savX(1) = RX1
  359.         savY(1) = RY1
  360.         savX(2) = RX2
  361.         savY(2) = RY1
  362.         savY(3) = RY2
  363.         savX(3) = RX1
  364.         savY(4) = RY2
  365.         savX(4) = RX2
  366.         savAlpha(1) = L1 * L2
  367.         savAlpha(2) = L1 * L3
  368.         savAlpha(3) = L4 * L2
  369.         savAlpha(4) = L4 * L3
  370.  
  371.         For Cl = 1 To 4
  372.             Strength = savAlpha(Cl)
  373.             X4 = savX(Cl)
  374.             Y4 = savY(Cl)
  375.             If Strength > 252 Then    '> 99%
  376.                 SetPixelV m_hDC, X4, Y4, Color
  377.             Else
  378.                 Bgr = GetPixel(m_hDC, X4, Y4)
  379.                 If Bgr Then       'if not black
  380.                     Rbg = Bgr And &HFF&
  381.                     Gbg = (Bgr And &HFF00&) \ &H100&
  382.                     Bbg = (Bgr And &HFF0000) \ &H10000
  383.                 Else
  384.                     Rbg = 0
  385.                     Gbg = 0
  386.                     Bbg = 0
  387.                 End If
  388.                 StrengthI = 255 - Strength
  389.                 Rblend = StrengthI * Rbg + Strength * Red
  390.                 Gblend = StrengthI * Gbg + Strength * Green
  391.                 Bblend = StrengthI * Bbg + Strength * Blue
  392.                 NewColor = RGB(Rblend \ 256, Gblend \ 256, Bblend \ 256)
  393.                 SetPixelV m_hDC, X4, Y4, NewColor
  394.             End If
  395.         Next
  396.     Next
  397.  
  398. End Sub
  399.  
  400. Private Function GetPointSpacing(Radius As Long, Thickness As cThickness) As Single
  401.     Dim sngLS      As Single
  402.  
  403.     If Thickness = Thick Then
  404.         sngLS = cThick
  405.     Else
  406.         sngLS = cThin
  407.     End If
  408.  
  409.     If Radius < 0 Then
  410.         GetPointSpacing = -sngLS / Radius
  411.     ElseIf Radius = 0 Then
  412.         GetPointSpacing = sngLS
  413.     Else
  414.         GetPointSpacing = sngLS / Radius
  415.     End If
  416.  
  417. End Function
  418.  
  419. Public Sub CircleDIB(ByVal x1 As Long, _
  420.                      ByVal y1 As Long, _
  421.                      ByVal RadiusX As Long, _
  422.                      ByVal RadiusY As Long, _
  423.                      ByVal Color As OLE_COLOR, _
  424.                      Optional ByVal Thickness As cThickness = Thick)
  425.  
  426.     Dim Bbg        As Byte
  427.     Dim Gbg        As Byte
  428.     Dim Rbg        As Byte
  429.     Dim savAlpha(1 To 4) As Byte
  430.     Dim Cl         As Long
  431.     Dim Strength   As Long
  432.     Dim StrengthI  As Long
  433.     Dim Quadrant   As Long
  434.     Dim Radius     As Long
  435.     Dim RX1        As Long
  436.     Dim RX2        As Long
  437.     Dim RY1        As Long
  438.     Dim RY2        As Long
  439.     Dim savX(1 To 4) As Long
  440.     Dim savY(1 To 4) As Long
  441.     Dim X4         As Long
  442.     Dim Y4         As Long
  443.     Dim Ax         As Single
  444.     Dim Ay         As Single
  445.     Dim Bx         As Single
  446.     Dim By         As Single
  447.     Dim L1         As Single
  448.     Dim L2         As Single
  449.     Dim L3         As Single
  450.     Dim L4         As Single
  451.     Dim sngAngle   As Single
  452.     Dim sngPointSpacing As Single
  453.     Dim x2         As Single
  454.     Dim Xp5        As Single
  455.     Dim y2         As Single
  456.  
  457.     If Not InDIBits Then
  458.         MsgBox "You must create a DIB array" & vbCrLf & _
  459.                "before calling CircleDIB."
  460.         Exit Sub
  461.     End If
  462.  
  463.     SetRGBComponents Color
  464.  
  465.     Radius = RadiusX
  466.     If RadiusY > RadiusX Then
  467.         Radius = RadiusY
  468.     End If
  469.  
  470.     sngPointSpacing = GetPointSpacing(Radius, Thickness)
  471.  
  472.     For sngAngle = 0 To HalfPi Step sngPointSpacing
  473.         x2 = RadiusX * Cos(sngAngle)
  474.         y2 = RadiusY * Sin(sngAngle)
  475.         'Prevents error when vb rounds .5 down
  476.         If x2 = Int(x2) Then x2 = x2 + 0.001
  477.         If y2 = Int(y2) Then y2 = y2 + 0.001
  478.         For Quadrant = 0 To 3
  479.             Select Case Quadrant
  480.                 Case 0            '0-90░
  481.                     Ax = x2 + x1 - 0.5
  482.                     Ay = -y2 + y1 - 0.5
  483.                 Case 1            '90-180░
  484.                     Ax = x2 + x1 - 0.5
  485.                     Ay = y2 + y1 - 0.5
  486.                 Case 2            '180-270░
  487.                     Ax = -x2 + x1 - 0.5
  488.                     Ay = y2 + y1 - 0.5
  489.                 Case 3            '270-360░
  490.                     Ax = -x2 + x1 - 0.5
  491.                     Ay = -y2 + y1 - 0.5
  492.             End Select
  493.  
  494.             Bx = Ax + 1
  495.             By = Ay + 1
  496.             RX1 = Ax
  497.             RX2 = RX1 + 1
  498.             Xp5 = RX1 + 0.5
  499.             RY1 = Ay
  500.             RY2 = By
  501.             L1 = RY1 + 0.5 - Ay
  502.             L2 = 256 * (Xp5 - Ax) - Xp5 + Ax
  503.             L3 = 255 - L2
  504.             L4 = By - RY2 + 0.5
  505.             savX(1) = RX1
  506.             savY(1) = RY1
  507.             savX(2) = RX2
  508.             savY(2) = RY1
  509.             savY(3) = RY2
  510.             savX(3) = RX1
  511.             savY(4) = RY2
  512.             savX(4) = RX2
  513.             savAlpha(1) = L1 * L2
  514.             savAlpha(2) = L1 * L3
  515.             savAlpha(3) = L4 * L2
  516.             savAlpha(4) = L4 * L3
  517.  
  518.             For Cl = 1 To 4
  519.                 Strength = savAlpha(Cl)
  520.                 X4 = savX(Cl)
  521.                 Y4 = savY(Cl)
  522.                 'Check if in bounds
  523.                 If X4 >= 0 And X4 < m_W1 And Y4 >= 0 And Y4 <= m_H1 Then
  524.                     If Strength > 252 Then    '> 99%
  525.                         'No blending
  526.                         buf(X4, Y4).Blue = Blue
  527.                         buf(X4, Y4).Green = Green
  528.                         buf(X4, Y4).Red = Red
  529.                     Else
  530.                         Bbg = buf(X4, Y4).Blue
  531.                         Gbg = buf(X4, Y4).Green
  532.                         Rbg = buf(X4, Y4).Red
  533.                         'Blend % of bgColor with % of Color
  534.                         StrengthI = 255 - Strength
  535.                         buf(X4, Y4).Red = (StrengthI * Rbg + Strength * Red) \ 256
  536.                         buf(X4, Y4).Green = (StrengthI * Gbg + Strength * Green) \ 256
  537.                         buf(X4, Y4).Blue = (StrengthI * Bbg + Strength * Blue) \ 256
  538.                     End If
  539.                 End If
  540.             Next
  541.         Next
  542.     Next
  543. End Sub
  544.  
  545. Public Sub ArcDIB(ByVal x1 As Long, _
  546.                   ByVal y1 As Long, _
  547.                   ByVal RadiusX As Long, _
  548.                   ByVal RadiusY As Long, _
  549.                   ByVal StartAngle As Single, _
  550.                   ByVal StopAngle As Single, _
  551.                   ByVal Color As OLE_COLOR, _
  552.                   Optional ByVal Thickness As cThickness = Thick)
  553.  
  554.     Dim Bbg        As Byte
  555.     Dim Gbg        As Byte
  556.     Dim Rbg        As Byte
  557.     Dim savAlpha(1 To 4) As Byte
  558.     Dim Cl         As Long
  559.     Dim Strength   As Long
  560.     Dim StrengthI  As Long
  561.     Dim Radius     As Long
  562.     Dim RX1        As Long
  563.     Dim RX2        As Long
  564.     Dim RY1        As Long
  565.     Dim RY2        As Long
  566.     Dim savX(1 To 4) As Long
  567.     Dim savY(1 To 4) As Long
  568.     Dim X4         As Long
  569.     Dim Y4         As Long
  570.     Dim Ax         As Single
  571.     Dim Ay         As Single
  572.     Dim Bx         As Single
  573.     Dim By         As Single
  574.     Dim L1         As Single
  575.     Dim L2         As Single
  576.     Dim L3         As Single
  577.     Dim L4         As Single
  578.     Dim sngAngle   As Single
  579.     Dim sngPointSpacing As Single
  580.     Dim x2         As Single
  581.     Dim Xp5        As Single
  582.     Dim y2         As Single
  583.  
  584.     If Not InDIBits Then
  585.         MsgBox "You must create a DIB array" & vbCrLf & _
  586.                "before calling CircleDIB."
  587.         Exit Sub
  588.     End If
  589.  
  590.     SetRGBComponents Color
  591.  
  592.     Radius = RadiusX
  593.     If RadiusY > RadiusX Then
  594.         Radius = RadiusY
  595.     End If
  596.  
  597.     sngPointSpacing = GetPointSpacing(Radius, Thickness)
  598.  
  599.     If StartAngle > StopAngle Then
  600.         StopAngle = StopAngle + 360
  601.     End If
  602.     'Convert to Radians
  603.     StartAngle = StartAngle * Rads
  604.     StopAngle = StopAngle * Rads
  605.  
  606.     For sngAngle = StartAngle To StopAngle Step sngPointSpacing
  607.         x2 = RadiusX * Cos(sngAngle - HalfPi)
  608.         y2 = RadiusY * Sin(sngAngle + HalfPi)
  609.         'Prevents error when vb rounds .5 down
  610.         If x2 = Int(x2) Then x2 = x2 + 0.001
  611.         If y2 = Int(y2) Then y2 = y2 + 0.001
  612.         Ax = x2 + x1 - 0.5
  613.         Ay = y2 + y1 - 0.5
  614.         Bx = Ax + 1
  615.         By = Ay + 1
  616.         RX1 = Ax
  617.         RX2 = RX1 + 1
  618.         Xp5 = RX1 + 0.5
  619.         RY1 = Ay
  620.         RY2 = By
  621.         L1 = RY1 + 0.5 - Ay
  622.         L2 = 256 * (Xp5 - Ax) - Xp5 + Ax
  623.         L3 = 255 - L2
  624.         L4 = By - RY2 + 0.5
  625.         savX(1) = RX1
  626.         savY(1) = RY1
  627.         savX(2) = RX2
  628.         savY(2) = RY1
  629.         savY(3) = RY2
  630.         savX(3) = RX1
  631.         savY(4) = RY2
  632.         savX(4) = RX2
  633.         savAlpha(1) = L1 * L2
  634.         savAlpha(2) = L1 * L3
  635.         savAlpha(3) = L4 * L2
  636.         savAlpha(4) = L4 * L3
  637.  
  638.         For Cl = 1 To 4
  639.             Strength = savAlpha(Cl)
  640.             X4 = savX(Cl)
  641.             Y4 = savY(Cl)
  642.             'Check if in bounds
  643.             If X4 >= 0 And X4 < m_W1 And Y4 >= 0 And Y4 <= m_H1 Then
  644.                 If Strength > 252 Then    '> 99%
  645.                     'No blending
  646.                     buf(X4, Y4).Blue = Blue
  647.                     buf(X4, Y4).Green = Green
  648.                     buf(X4, Y4).Red = Red
  649.                 Else
  650.                     Bbg = buf(X4, Y4).Blue
  651.                     Gbg = buf(X4, Y4).Green
  652.                     Rbg = buf(X4, Y4).Red
  653.                     'Blend % of bgColor with % of Color
  654.                     StrengthI = 255 - Strength
  655.                     buf(X4, Y4).Red = (StrengthI * Rbg + Strength * Red) \ 256
  656.                     buf(X4, Y4).Green = (StrengthI * Gbg + Strength * Green) \ 256
  657.                     buf(X4, Y4).Blue = (StrengthI * Bbg + Strength * Blue) \ 256
  658.                 End If
  659.             End If
  660.         Next
  661.     Next
  662. End Sub
  663.  
  664. Public Sub SetRGBComponents(ByVal Color As OLE_COLOR)
  665.  
  666.     Color = TranslateColour(Color)
  667.     m_Color = Color               'make available global
  668.     If Color Then
  669.         Red = Color And &HFF&
  670.         Green = Color \ 256 And &HFF
  671.         Blue = Color \ 65536
  672.     Else                          'Color is Black
  673.         Red = 0
  674.         Green = 0
  675.         Blue = 0
  676.     End If
  677. End Sub
  678.  
  679. Public Sub LineGP(ByVal hdc As Long, _
  680.                   ByVal x1 As Long, _
  681.                   ByVal y1 As Long, _
  682.                   ByVal x2 As Long, _
  683.                   ByVal y2 As Long, _
  684.                   ByVal Color As OLE_COLOR)
  685.  
  686.     Dim XScope     As Long
  687.     Dim YScope     As Long
  688.     Dim XDir       As Long
  689.     Dim YDir       As Long
  690.     Dim LinearDeviance As Long
  691.     Dim Counter    As Long
  692.     Dim AntiAliasStrength As Long
  693.     Dim EndPointIntensity As Long
  694.  
  695.     Const HalfIntensity As Long = 127
  696.  
  697.     'Blended lines, maximum blend at transition,
  698.     'tapering off too minimum.
  699.     '
  700.     '            ----------
  701.     'Min    Max/Max     Min
  702.     '----------
  703.     '
  704.     m_hDC = hdc
  705.     m_Color = Color
  706.  
  707.     XScope = x2 - x1
  708.     YScope = y2 - y1
  709.  
  710.     If XScope < 0 Then
  711.         XScope = Abs(XScope)
  712.         XDir = -1
  713.     Else
  714.         XDir = 1
  715.     End If
  716.  
  717.     If YScope < 0 Then
  718.         YScope = Abs(YScope)
  719.         YDir = -1
  720.     Else
  721.         YDir = 1
  722.     End If
  723.  
  724.     If XScope + YScope = 0 Then
  725.         'Exit if line length is 0
  726.         Exit Sub
  727.     End If
  728.  
  729.     SetRGBComponents Color
  730.  
  731.     If XScope > YScope Then
  732.         'Output EndPoints outside of main loop.
  733.         EndPointIntensity = (85 * YScope) \ XScope
  734.         PutPixelGP x1 - XDir, y1 - YDir, EndPointIntensity
  735.         PutPixelGP x1 - XDir, y1, HalfIntensity
  736.         PutPixelGP x2 + XDir, y2 + YDir, EndPointIntensity
  737.         PutPixelGP x2 + XDir, y2, HalfIntensity
  738.         '-----
  739.         LinearDeviance = XScope \ 2
  740.         For Counter = 0 To XScope
  741.             'Main line, output full strength direct to hDC.
  742.             SetPixelV m_hDC, x1, y1, m_Color
  743.             'Output the blended lines for anti-alias effect.
  744.             AntiAliasStrength = (LinearDeviance * 255) \ XScope
  745.             PutPixelGP x1, y1 - YDir, 255 - AntiAliasStrength
  746.             PutPixelGP x1, y1 + YDir, AntiAliasStrength
  747.             LinearDeviance = (LinearDeviance + YScope)
  748.             If LinearDeviance >= XScope Then
  749.                 LinearDeviance = LinearDeviance - XScope
  750.                 y1 = y1 + YDir
  751.             End If
  752.             x1 = x1 + XDir
  753.         Next
  754.     Else
  755.         'Output EndPoints outside of main loop.
  756.         EndPointIntensity = (85 * XScope) \ YScope
  757.         PutPixelGP x1 - XDir, y1 - YDir, EndPointIntensity
  758.         PutPixelGP x1, y1 - YDir, HalfIntensity
  759.         PutPixelGP x2 + XDir, y2 + YDir, EndPointIntensity
  760.         PutPixelGP x2, y2 + YDir, HalfIntensity
  761.         '-----
  762.         LinearDeviance = YScope \ 2
  763.         For Counter = 0 To YScope
  764.             'Main line, output full strength direct to hDC.
  765.             SetPixelV m_hDC, x1, y1, m_Color
  766.             'Output the blended lines for anti-alias effect.
  767.             AntiAliasStrength = (LinearDeviance * 255) \ YScope
  768.             PutPixelGP x1 - XDir, y1, 255 - AntiAliasStrength
  769.             PutPixelGP x1 + XDir, y1, AntiAliasStrength
  770.             LinearDeviance = LinearDeviance + XScope
  771.             If (LinearDeviance >= YScope) Then
  772.                 LinearDeviance = LinearDeviance - YScope
  773.                 x1 = x1 + XDir
  774.             End If
  775.             y1 = y1 + YDir
  776.         Next
  777.     End If
  778.  
  779. End Sub
  780.  
  781. Public Sub LineDIB(ByVal x1 As Long, _
  782.                    ByVal y1 As Long, _
  783.                    ByVal x2 As Long, _
  784.                    ByVal y2 As Long, _
  785.                    ByVal Color As OLE_COLOR)
  786.  
  787.     'Blended lines, maximum blend at transition,
  788.     'tapering off too minimum.
  789.     '
  790.     '            ----------
  791.     'Min    Max/Max     Min
  792.     '----------
  793.     '
  794.  
  795.     If Not InDIBits Then
  796.         MsgBox "You must create a DIB array" & vbCrLf & _
  797.                "before calling LineDIB."
  798.         Exit Sub
  799.     End If
  800.  
  801.     Dim XScope     As Long
  802.     Dim YScope     As Long
  803.     Dim XDir       As Long
  804.     Dim YDir       As Long
  805.     Dim LinearDeviance As Long
  806.     Dim Counter    As Long
  807.     Dim AntiAliasStrength As Long
  808.     Dim EndPointIntensity As Long
  809.  
  810.     Const HalfIntensity As Long = 127
  811.  
  812.     XScope = x2 - x1
  813.     YScope = y2 - y1
  814.  
  815.     If XScope < 0 Then
  816.         XScope = Abs(XScope)
  817.         XDir = -1
  818.     Else
  819.         XDir = 1
  820.     End If
  821.  
  822.     If YScope < 0 Then
  823.         YScope = Abs(YScope)
  824.         YDir = -1
  825.     Else
  826.         YDir = 1
  827.     End If
  828.  
  829.     If XScope + YScope = 0 Then
  830.         'Exit if line length is 0
  831.         Exit Sub
  832.     End If
  833.  
  834.     SetRGBComponents Color
  835.  
  836.     If XScope > YScope Then
  837.         'Output EndPoints outside of main loop.
  838.         EndPointIntensity = (85 * YScope) \ XScope
  839.         PutPixelDIB x1 - XDir, y1 - YDir, EndPointIntensity
  840.         PutPixelDIB x1 - XDir, y1, HalfIntensity
  841.         PutPixelDIB x2 + XDir, y2 + YDir, EndPointIntensity
  842.         PutPixelDIB x2 + XDir, y2, HalfIntensity
  843.         '-----
  844.         LinearDeviance = XScope \ 2
  845.         For Counter = 0 To XScope
  846.             'Main line, output full strength direct to DIB array.
  847.             PutPixelDIB x1, y1, 255
  848.             'Output the blended lines for anti-alias effect.
  849.             AntiAliasStrength = (LinearDeviance * 255) \ XScope
  850.             PutPixelDIB x1, y1 - YDir, 255 - AntiAliasStrength
  851.             PutPixelDIB x1, y1 + YDir, AntiAliasStrength
  852.             LinearDeviance = (LinearDeviance + YScope)
  853.             If LinearDeviance >= XScope Then
  854.                 LinearDeviance = LinearDeviance - XScope
  855.                 y1 = y1 + YDir
  856.             End If
  857.             x1 = x1 + XDir
  858.         Next
  859.     Else
  860.         'Output EndPoints outside of main loop.
  861.         EndPointIntensity = (85 * XScope) \ YScope
  862.         PutPixelDIB x1 - XDir, y1 - YDir, EndPointIntensity
  863.         PutPixelDIB x1, y1 - YDir, HalfIntensity
  864.         PutPixelDIB x2 + XDir, y2 + YDir, EndPointIntensity
  865.         PutPixelDIB x2, y2 + YDir, HalfIntensity
  866.         '-----
  867.         LinearDeviance = YScope \ 2
  868.         For Counter = 0 To YScope
  869.             'Main line, output full strength direct to DIB array.
  870.             PutPixelDIB x1, y1, 255
  871.             'Output the blended lines for anti-alias effect.
  872.             AntiAliasStrength = (LinearDeviance * 255) \ YScope
  873.             PutPixelDIB x1 - XDir, y1, 255 - AntiAliasStrength
  874.             PutPixelDIB x1 + XDir, y1, AntiAliasStrength
  875.             LinearDeviance = LinearDeviance + XScope
  876.             If (LinearDeviance >= YScope) Then
  877.                 LinearDeviance = LinearDeviance - YScope
  878.                 x1 = x1 + XDir
  879.             End If
  880.             y1 = y1 + YDir
  881.         Next
  882.     End If
  883.     '85
  884. End Sub
  885.  
  886. Public Sub LineDibNoAA(X, Y, x2, y2, C As Long)
  887.     'Po-Han Lin
  888.     Dim yLonger    As Boolean
  889.     Dim incrementVal As Long
  890.     Dim shortLen   As Long
  891.     Dim longLen    As Long
  892.     Dim Swap       As Long
  893.     Dim multDIFF   As Single
  894.     Dim I          As Long
  895.  
  896.     SetRGBComponents C
  897.  
  898.     shortLen = y2 - Y
  899.     longLen = x2 - X
  900.  
  901.     If (Abs(shortLen) > Abs(longLen)) Then
  902.         Swap = shortLen
  903.         shortLen = longLen
  904.         longLen = Swap
  905.         yLonger = True
  906.     End If
  907.  
  908.     If (longLen < 0) Then
  909.         incrementVal = -1
  910.     Else
  911.         incrementVal = 1
  912.     End If
  913.  
  914.  
  915.     If (longLen = 0) Then
  916.         multDIFF = shortLen
  917.     Else
  918.         multDIFF = shortLen / longLen
  919.     End If
  920.  
  921.     If (yLonger) Then
  922.         I = 0
  923.         Do
  924.             'myPixel(surface,x+(int)((double)i*multDiff),y+i);
  925.             PutPixelDIB X + I * multDIFF, Y + I, 255
  926.  
  927.             I = I + incrementVal
  928.         Loop While I <> longLen
  929.     Else
  930.         I = 0
  931.         Do
  932.             'myPixel(surface,x+i,y+(int)((double)i*multDiff));
  933.             PutPixelDIB X + I, Y + I * multDIFF, 255
  934.  
  935.             I = I + incrementVal
  936.         Loop While I <> longLen
  937.     End If
  938. End Sub
  939. Public Sub Array2Pic()
  940.     'If we have an array copy back to hDC
  941.     If InDIBits Then
  942.         SetDIBits m_hDC, m_Handle, 0, m_H1, buf(0, 0), Binfo, DIB_RGB_COLORS
  943.         'InDIBits = False
  944.         'Erase buf '* Moved to Class_Terminate
  945.  
  946.     End If
  947. End Sub
  948.  
  949. Private Sub PutPixelGP(ByVal X As Long, _
  950.                        ByVal Y As Long, _
  951.                        ByVal Strength As Long)
  952.  
  953.     Dim Color      As Long
  954.     Dim bgColor    As Long
  955.     Dim Rbg        As Long
  956.     Dim Gbg        As Long
  957.     Dim Bbg        As Long
  958.     Dim Rblend     As Long
  959.     Dim Gblend     As Long
  960.     Dim Bblend     As Long
  961.     Dim StrengthI  As Long
  962.  
  963.     If Strength > 252 Then        '99%
  964.         SetPixelV m_hDC, X, Y, m_Color
  965.     Else
  966.         '##### Get Background Pixel components
  967.         bgColor = GetPixel(m_hDC, X, Y)
  968.         If bgColor Then           'i.e. Not Black
  969.             Rbg = bgColor And &HFF&
  970.             Gbg = (bgColor And &HFF00&) \ &H100&
  971.             Bbg = (bgColor And &HFF0000) \ &H10000
  972.         End If
  973.         '##### Blend % of bgColor with % of m_Color
  974.         StrengthI = 255 - Strength
  975.         Rblend = StrengthI * Rbg + Strength * Red
  976.         Gblend = StrengthI * Gbg + Strength * Green
  977.         Bblend = StrengthI * Bbg + Strength * Blue
  978.         '##### Write
  979.         Color = RGB(Rblend \ 256, Gblend \ 256, Bblend \ 256)
  980.         SetPixelV m_hDC, X, Y, Color
  981.     End If
  982.  
  983. End Sub
  984.  
  985. Private Sub PutPixelDIB(ByVal X As Long, _
  986.                         ByVal Y As Long, _
  987.                         ByVal Strength As Long)
  988.  
  989.     Dim Rbg        As Long
  990.     Dim Gbg        As Long
  991.     Dim Bbg        As Long
  992.     Dim StrengthI  As Long
  993.  
  994.     'Check if in bounds
  995.     If X < 0 Or X >= m_W1 - 1 Or Y < 0 Or Y > m_H1 - 1 Then
  996.         Exit Sub
  997.     End If
  998.     If Strength > 252 Then        '99% '252
  999.         buf(X, Y).Blue = Blue
  1000.         buf(X, Y).Green = Green
  1001.         buf(X, Y).Red = Red
  1002.     Else
  1003.         '##### Get Background Pixel components
  1004.         Bbg = buf(X, Y).Blue
  1005.         Gbg = buf(X, Y).Green
  1006.         Rbg = buf(X, Y).Red
  1007.         '##### Blend % of bgColor with % of m_Color
  1008.         StrengthI = 255 - Strength
  1009.         buf(X, Y).Red = (StrengthI * Rbg + Strength * Red) \ 256
  1010.         buf(X, Y).Green = (StrengthI * Gbg + Strength * Green) \ 256
  1011.         buf(X, Y).Blue = (StrengthI * Bbg + Strength * Blue) \ 256
  1012.     End If
  1013. End Sub
  1014.  
  1015. Private Sub Class_Terminate()
  1016.     Erase buf()
  1017. End Sub
  1018.  
  1019. Public Sub FadeDIB(Optional PERC As Long = 75)
  1020.     'by reexre
  1021.     Dim X          As Long
  1022.     Dim Y          As Long
  1023.     Dim P          As Single
  1024.     P = PERC * 0.01
  1025.     For X = 0 To m_W1 - 1
  1026.         For Y = 0 To m_H1 - 1
  1027.             With buf(X, Y)
  1028.                 If .Red Or .Green Or .Blue Then
  1029.                     .Red = .Red * P
  1030.                     .Green = .Green * P
  1031.                     .Blue = .Blue * P
  1032.                 End If
  1033.             End With
  1034.         Next
  1035.     Next
  1036.  
  1037. End Sub
  1038. Public Sub InvertDIB()
  1039.     'by reexre
  1040.     Dim X          As Long
  1041.     Dim Y          As Long
  1042.  
  1043.     For X = 0 To m_W1 - 1
  1044.         For Y = 0 To m_H1 - 1
  1045.             With buf(X, Y)
  1046.                 .Red = 255 - .Red
  1047.                 .Green = 255 - .Green
  1048.                 .Blue = 255 - .Blue
  1049.  
  1050.             End With
  1051.         Next
  1052.     Next
  1053. End Sub
  1054.