home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 6_2008-2009.ISO / data / zips / MM_CheckBo214306272009.psc / LineGS.cls < prev    next >
Text File  |  2009-01-27  |  28KB  |  945 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. Public Enum cThickness
  25.    Thin
  26.    Thick
  27. End Enum
  28. Private Type RGBQUAD
  29.    Blue                 As Byte
  30.    Green                As Byte
  31.    Red                  As Byte
  32.    Reserved             As Byte
  33. End Type
  34.  
  35. Private Type BITMAPINFOHEADER
  36.    biSize               As Long
  37.    biWidth              As Long
  38.    biHeight             As Long
  39.    biPlanes             As Integer
  40.    biBitCount           As Integer
  41.    biCompression        As Long
  42.    biSizeImage          As Long
  43.    biXPelsPerMeter      As Long
  44.    biYPelsPerMeter      As Long
  45.    biClrUsed            As Long
  46.    biClrImportant       As Long
  47. End Type
  48.  
  49. Private Type BITMAPINFO
  50.    bmiHeader            As BITMAPINFOHEADER
  51. End Type
  52.  
  53. Private Type RECT
  54.    Left     As Long
  55.    Top      As Long
  56.    Right    As Long
  57.    Bottom   As Long
  58. End Type
  59.  
  60. Private Const DIB_RGB_COLORS As Long = 0
  61. Private Const Pi        As Single = 3.141592
  62. Private Const HalfPi    As Single = Pi / 2
  63. Private Const cThin     As Single = Pi * 0.34
  64. Private Const cThick    As Single = Pi * 0.17
  65. Private Const Rads      As Single = Pi / 180
  66. Private Const PS_SOLID  As Long = 0
  67.  
  68. Private Binfo           As BITMAPINFO
  69. Private buf()           As RGBQUAD
  70. Private InDIBits        As Boolean
  71. Private Red             As Long
  72. Private Green           As Long
  73. Private Blue            As Long
  74. Private m_Color         As Long
  75. Private m_hDC           As Long
  76. Private m_W1            As Long
  77. Private m_H1            As Long
  78. Private m_Handle        As Long
  79.  
  80. 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
  81. Private Declare Function OleTranslateColor Lib "OLEPRO32.DLL" (ByVal OLE_COLOR As Long, ByVal HPALETTE As Long, pccolorref As Long) As Long
  82. Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
  83. Private Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
  84. 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
  85. 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
  86.  
  87. 'Public Sub Widget(rct As RECT)
  88.  
  89. 'End Sub
  90. Private Function TranslateColour(ByVal clr As OLE_COLOR, _
  91.    Optional hPal As Long = 0) As Long
  92.    If OleTranslateColor(clr, hPal, TranslateColour) Then
  93.       TranslateColour = vbBlack 'CLR_INVALID
  94.    End If
  95. End Function
  96.  
  97. Public Sub DIB(ByVal hdc As Long, ByVal Handle As Long, ByVal W1 As Long, ByVal H1 As Long)
  98.    m_hDC = hdc
  99.    m_Handle = Handle
  100.    m_W1 = W1
  101.    m_H1 = H1
  102.    Pic2Array
  103. End Sub
  104.  
  105. Private Sub Pic2Array()
  106.    ReDim buf(0 To (m_W1 - 1), m_H1 - 1) As RGBQUAD
  107.    With Binfo.bmiHeader
  108.       .biSize = 40
  109.       .biWidth = m_W1
  110.       .biHeight = -m_H1
  111.       .biPlanes = 1
  112.       .biBitCount = 32
  113.       .biCompression = 0
  114.       .biClrUsed = 0
  115.       .biClrImportant = 0
  116.       .biSizeImage = m_W1 * m_H1
  117.    End With
  118.    'Copy hDC to Array
  119.    GetDIBits m_hDC, m_Handle, 0, m_H1, buf(0, 0), Binfo, DIB_RGB_COLORS
  120.    'Set local flag
  121.    InDIBits = True
  122. End Sub
  123.  
  124. Public Sub CircleGP(ByVal hdc As Long, _
  125.    ByVal X1 As Long, _
  126.    ByVal Y1 As Long, _
  127.    ByVal RadiusX As Long, _
  128.    ByVal RadiusY As Long, _
  129.    ByVal Color As OLE_COLOR, _
  130.    Optional ByVal Thickness As cThickness = Thick)
  131.  
  132.    Dim Bbg              As Byte
  133.    Dim Gbg              As Byte
  134.    Dim Rbg              As Byte
  135.    Dim savAlpha(1 To 4) As Byte
  136.    Dim Bblend           As Long
  137.    Dim Bgr              As Long
  138.    Dim Cl               As Long
  139.    Dim Gblend           As Long
  140.    Dim Strength         As Long
  141.    Dim StrengthI        As Long
  142.    Dim Quadrant         As Long
  143.    Dim Radius           As Long
  144.    Dim Rblend           As Long
  145.    Dim RX1              As Long
  146.    Dim RX2              As Long
  147.    Dim RY1              As Long
  148.    Dim RY2              As Long
  149.    Dim savX(1 To 4)     As Long
  150.    Dim savY(1 To 4)     As Long
  151.    Dim X4               As Long
  152.    Dim Y4               As Long
  153.    Dim NewColor         As Long
  154.    Dim Ax               As Single
  155.    Dim Ay               As Single
  156.    Dim Bx               As Single
  157.    Dim By               As Single
  158.    Dim L1               As Single
  159.    Dim L2               As Single
  160.    Dim L3               As Single
  161.    Dim L4               As Single
  162.    Dim sngAngle         As Single
  163.    Dim sngPointSpacing  As Single
  164.    Dim X2               As Single
  165.    Dim Xp5              As Single
  166.    Dim Y2               As Single
  167.  
  168.    m_hDC = hdc
  169.  
  170.    SetRGBComponents Color
  171.  
  172.    Radius = RadiusX
  173.    If RadiusY > RadiusX Then
  174.       Radius = RadiusY
  175.    End If
  176.  
  177.    sngPointSpacing = GetPointSpacing(Radius, Thickness)
  178.  
  179.    For sngAngle = 0 To HalfPi Step sngPointSpacing
  180.       X2 = RadiusX * Cos(sngAngle)
  181.       Y2 = RadiusY * Sin(sngAngle)
  182.       'Prevents error when vb rounds .5 down
  183.       If X2 = Int(X2) Then X2 = X2 + 0.001
  184.       If Y2 = Int(Y2) Then Y2 = Y2 + 0.001
  185.       For Quadrant = 0 To 3
  186.          Select Case Quadrant
  187.             Case 0 '0-90░
  188.                Ax = X2 + X1 - 0.5
  189.                Ay = -Y2 + Y1 - 0.5
  190.             Case 1 '90-180░
  191.                Ax = X2 + X1 - 0.5
  192.                Ay = Y2 + Y1 - 0.5
  193.             Case 2 '180-270░
  194.                Ax = -X2 + X1 - 0.5
  195.                Ay = Y2 + Y1 - 0.5
  196.             Case 3 '270-360░
  197.                Ax = -X2 + X1 - 0.5
  198.                Ay = -Y2 + Y1 - 0.5
  199.          End Select
  200.          Bx = Ax + 1
  201.          By = Ay + 1
  202.          RX1 = Ax
  203.          RX2 = RX1 + 1
  204.          Xp5 = RX1 + 0.5
  205.          RY1 = Ay
  206.          RY2 = By
  207.          L1 = RY1 + 0.5 - Ay
  208.          L2 = 256 * (Xp5 - Ax) - Xp5 + Ax
  209.          L3 = 255 - L2
  210.          L4 = By - RY2 + 0.5
  211.          savX(1) = RX1
  212.          savY(1) = RY1
  213.          savX(2) = RX2
  214.          savY(2) = RY1
  215.          savY(3) = RY2
  216.          savX(3) = RX1
  217.          savY(4) = RY2
  218.          savX(4) = RX2
  219.          savAlpha(1) = L1 * L2
  220.          savAlpha(2) = L1 * L3
  221.          savAlpha(3) = L4 * L2
  222.          savAlpha(4) = L4 * L3
  223.  
  224.          For Cl = 1 To 4
  225.             Strength = savAlpha(Cl)
  226.             X4 = savX(Cl)
  227.             Y4 = savY(Cl)
  228.             If Strength > 252 Then '> 99%
  229.                SetPixelV m_hDC, X4, Y4, Color
  230.             Else
  231.                Bgr = GetPixel(m_hDC, X4, Y4)
  232.                If Bgr Then 'if not black
  233.                   Rbg = Bgr And &HFF&
  234.                   Gbg = (Bgr And &HFF00&) \ &H100&
  235.                   Bbg = (Bgr And &HFF0000) \ &H10000
  236.                Else
  237.                   Rbg = 0
  238.                   Gbg = 0
  239.                   Bbg = 0
  240.                End If
  241.                StrengthI = 255 - Strength
  242.                Rblend = StrengthI * Rbg + Strength * Red
  243.                Gblend = StrengthI * Gbg + Strength * Green
  244.                Bblend = StrengthI * Bbg + Strength * Blue
  245.                NewColor = RGB(Rblend \ 256, Gblend \ 256, Bblend \ 256)
  246.                SetPixelV m_hDC, X4, Y4, NewColor
  247.             End If
  248.          Next
  249.       Next
  250.    Next
  251.  
  252. End Sub
  253.  
  254. Public Sub ArcGP(ByVal hdc As Long, _
  255.    ByVal X1 As Long, _
  256.    ByVal Y1 As Long, _
  257.    ByVal RadiusX As Long, _
  258.    ByVal RadiusY As Long, _
  259.    ByVal StartAngle As Single, _
  260.    ByVal StopAngle As Single, _
  261.    ByVal Color As OLE_COLOR, _
  262.    Optional ByVal Thickness As cThickness = Thick)
  263.  
  264.    Dim Bbg              As Byte
  265.    Dim Gbg              As Byte
  266.    Dim Rbg              As Byte
  267.    Dim savAlpha(1 To 4) As Byte
  268.    Dim Bblend           As Long
  269.    Dim Bgr              As Long
  270.    Dim Cl               As Long
  271.    Dim Gblend           As Long
  272.    Dim Strength         As Long
  273.    Dim StrengthI        As Long
  274.    Dim Radius           As Long
  275.    Dim Rblend           As Long
  276.    Dim RX1              As Long
  277.    Dim RX2              As Long
  278.    Dim RY1              As Long
  279.    Dim RY2              As Long
  280.    Dim savX(1 To 4)     As Long
  281.    Dim savY(1 To 4)     As Long
  282.    Dim X4               As Long
  283.    Dim Y4               As Long
  284.    Dim NewColor         As Long
  285.    Dim Ax               As Single
  286.    Dim Ay               As Single
  287.    Dim Bx               As Single
  288.    Dim By               As Single
  289.    Dim L1               As Single
  290.    Dim L2               As Single
  291.    Dim L3               As Single
  292.    Dim L4               As Single
  293.    Dim sngAngle         As Single
  294.    Dim sngPointSpacing  As Single
  295.    Dim X2               As Single
  296.    Dim Xp5              As Single
  297.    Dim Y2               As Single
  298.  
  299.    m_hDC = hdc
  300.  
  301.    SetRGBComponents Color
  302.  
  303.    Radius = RadiusX
  304.    If RadiusY > RadiusX Then
  305.       Radius = RadiusY
  306.    End If
  307.  
  308.    sngPointSpacing = GetPointSpacing(Radius, Thickness)
  309.  
  310.    If StartAngle > StopAngle Then
  311.       StopAngle = StopAngle + 360
  312.    End If
  313.    'Convert to Radians
  314.    StartAngle = StartAngle * Rads
  315.    StopAngle = StopAngle * Rads
  316.  
  317.    For sngAngle = StartAngle To StopAngle Step sngPointSpacing
  318.       X2 = RadiusX * Cos(sngAngle - HalfPi)
  319.       Y2 = RadiusY * Sin(sngAngle - HalfPi)
  320.       'Prevents error when vb rounds .5 down
  321.       If X2 = Int(X2) Then X2 = X2 + 0.001
  322.       If Y2 = Int(Y2) Then Y2 = Y2 + 0.001
  323.       Ax = X2 + X1 - 0.5
  324.       Ay = Y2 + Y1 - 0.5
  325.       Bx = Ax + 1
  326.       By = Ay + 1
  327.       RX1 = Ax
  328.       RX2 = RX1 + 1
  329.       Xp5 = RX1 + 0.5
  330.       RY1 = Ay
  331.       RY2 = By
  332.       L1 = RY1 + 0.5 - Ay
  333.       L2 = 256 * (Xp5 - Ax) - Xp5 + Ax
  334.       L3 = 255 - L2
  335.       L4 = By - RY2 + 0.5
  336.       savX(1) = RX1
  337.       savY(1) = RY1
  338.       savX(2) = RX2
  339.       savY(2) = RY1
  340.       savY(3) = RY2
  341.       savX(3) = RX1
  342.       savY(4) = RY2
  343.       savX(4) = RX2
  344.       savAlpha(1) = L1 * L2
  345.       savAlpha(2) = L1 * L3
  346.       savAlpha(3) = L4 * L2
  347.       savAlpha(4) = L4 * L3
  348.  
  349.       For Cl = 1 To 4
  350.          Strength = savAlpha(Cl)
  351.          X4 = savX(Cl)
  352.          Y4 = savY(Cl)
  353.          If Strength > 252 Then '> 99%
  354.             SetPixelV m_hDC, X4, Y4, Color
  355.          Else
  356.             Bgr = GetPixel(m_hDC, X4, Y4)
  357.             If Bgr Then 'if not black
  358.                Rbg = Bgr And &HFF&
  359.                Gbg = (Bgr And &HFF00&) \ &H100&
  360.                Bbg = (Bgr And &HFF0000) \ &H10000
  361.             Else
  362.                Rbg = 0
  363.                Gbg = 0
  364.                Bbg = 0
  365.             End If
  366.             StrengthI = 255 - Strength
  367.             Rblend = StrengthI * Rbg + Strength * Red
  368.             Gblend = StrengthI * Gbg + Strength * Green
  369.             Bblend = StrengthI * Bbg + Strength * Blue
  370.             NewColor = RGB(Rblend \ 256, Gblend \ 256, Bblend \ 256)
  371.             SetPixelV m_hDC, X4, Y4, NewColor
  372.          End If
  373.       Next
  374.    Next
  375.  
  376. End Sub
  377.  
  378. Private Function GetPointSpacing(Radius As Long, Thickness As cThickness) As Single
  379.    Dim sngLS            As Single
  380.  
  381.    If Thickness = Thick Then
  382.       sngLS = cThick
  383.    Else
  384.       sngLS = cThin
  385.    End If
  386.  
  387.    If Radius < 0 Then
  388.       GetPointSpacing = -sngLS / Radius
  389.    ElseIf Radius = 0 Then
  390.       GetPointSpacing = sngLS
  391.    Else
  392.       GetPointSpacing = sngLS / Radius
  393.    End If
  394.  
  395. End Function
  396.  
  397. Public Sub CircleDIB(ByVal X1 As Long, _
  398.    ByVal Y1 As Long, _
  399.    ByVal RadiusX As Long, _
  400.    ByVal RadiusY As Long, _
  401.    ByVal Color As OLE_COLOR, _
  402.    Optional ByVal Thickness As cThickness = Thick)
  403.  
  404. On Error Resume Next
  405.    Dim Bbg              As Byte
  406.    Dim Gbg              As Byte
  407.    Dim Rbg              As Byte
  408.    Dim savAlpha(1 To 4) As Byte
  409.    Dim Cl               As Long
  410.    Dim Strength         As Long
  411.    Dim StrengthI        As Long
  412.    Dim Quadrant         As Long
  413.    Dim Radius           As Long
  414.    Dim RX1              As Long
  415.    Dim RX2              As Long
  416.    Dim RY1              As Long
  417.    Dim RY2              As Long
  418.    Dim savX(1 To 4)     As Long
  419.    Dim savY(1 To 4)     As Long
  420.    Dim X4               As Long
  421.    Dim Y4               As Long
  422.    Dim Ax               As Single
  423.    Dim Ay               As Single
  424.    Dim Bx               As Single
  425.    Dim By               As Single
  426.    Dim L1               As Single
  427.    Dim L2               As Single
  428.    Dim L3               As Single
  429.    Dim L4               As Single
  430.    Dim sngAngle         As Single
  431.    Dim sngPointSpacing  As Single
  432.    Dim X2               As Single
  433.    Dim Xp5              As Single
  434.    Dim Y2               As Single
  435.  
  436.    If Not InDIBits Then
  437.       MsgBox "You must create a DIB array" & vbCrLf & _
  438.          "before calling CircleDIB."
  439.       Exit Sub
  440.    End If
  441.  
  442.    SetRGBComponents Color
  443.  
  444.    Radius = RadiusX
  445.    If RadiusY > RadiusX Then
  446.       Radius = RadiusY
  447.    End If
  448.  
  449.    sngPointSpacing = GetPointSpacing(Radius, Thickness)
  450.  
  451.    For sngAngle = 0 To HalfPi Step sngPointSpacing
  452.       X2 = RadiusX * Cos(sngAngle)
  453.       Y2 = RadiusY * Sin(sngAngle)
  454.       'Prevents error when vb rounds .5 down
  455.       If X2 = Int(X2) Then X2 = X2 + 0.001
  456.       If Y2 = Int(Y2) Then Y2 = Y2 + 0.001
  457.       For Quadrant = 0 To 3
  458.          Select Case Quadrant
  459.             Case 0 '0-90░
  460.                Ax = X2 + X1 - 0.5
  461.                Ay = -Y2 + Y1 - 0.5
  462.             Case 1 '90-180░
  463.                Ax = X2 + X1 - 0.5
  464.                Ay = Y2 + Y1 - 0.5
  465.             Case 2 '180-270░
  466.                Ax = -X2 + X1 - 0.5
  467.                Ay = Y2 + Y1 - 0.5
  468.             Case 3 '270-360░
  469.                Ax = -X2 + X1 - 0.5
  470.                Ay = -Y2 + Y1 - 0.5
  471.          End Select
  472.  
  473.          Bx = Ax + 1
  474.          By = Ay + 1
  475.          RX1 = Ax
  476.          RX2 = RX1 + 1
  477.          Xp5 = RX1 + 0.5
  478.          RY1 = Ay
  479.          RY2 = By
  480.          L1 = RY1 + 0.5 - Ay
  481.          L2 = 256 * (Xp5 - Ax) - Xp5 + Ax
  482.          L3 = 255 - L2
  483.          L4 = By - RY2 + 0.5
  484.          savX(1) = RX1
  485.          savY(1) = RY1
  486.          savX(2) = RX2
  487.          savY(2) = RY1
  488.          savY(3) = RY2
  489.          savX(3) = RX1
  490.          savY(4) = RY2
  491.          savX(4) = RX2
  492.          savAlpha(1) = L1 * L2
  493.          savAlpha(2) = L1 * L3
  494.          savAlpha(3) = L4 * L2
  495.          savAlpha(4) = L4 * L3
  496.  
  497.          For Cl = 1 To 4
  498.             Strength = savAlpha(Cl)
  499.             X4 = savX(Cl)
  500.             Y4 = savY(Cl)
  501.             'Check if in bounds
  502.             If X4 >= 0 And X4 < m_W1 And Y4 >= 0 And Y4 <= m_H1 Then
  503.                If Strength > 252 Then  '> 99%
  504.                   'No blending
  505.                   buf(X4, Y4).Blue = Blue
  506.                   buf(X4, Y4).Green = Green
  507.                   buf(X4, Y4).Red = Red
  508.                Else
  509.                   Bbg = buf(X4, Y4).Blue
  510.                   Gbg = buf(X4, Y4).Green
  511.                   Rbg = buf(X4, Y4).Red
  512.                   'Blend % of bgColor with % of Color
  513.                   StrengthI = 255 - Strength
  514.                   buf(X4, Y4).Red = (StrengthI * Rbg + Strength * Red) \ 256
  515.                   buf(X4, Y4).Green = (StrengthI * Gbg + Strength * Green) \ 256
  516.                   buf(X4, Y4).Blue = (StrengthI * Bbg + Strength * Blue) \ 256
  517.                End If
  518.             End If
  519.          Next
  520.       Next
  521.    Next
  522. End Sub
  523.  
  524. Public Sub ArcDIB(ByVal X1 As Long, _
  525.    ByVal Y1 As Long, _
  526.    ByVal RadiusX As Long, _
  527.    ByVal RadiusY As Long, _
  528.    ByVal StartAngle As Single, _
  529.    ByVal StopAngle As Single, _
  530.    ByVal Color As OLE_COLOR, _
  531.    Optional ByVal Thickness As cThickness = Thick)
  532.  
  533.    Dim Bbg              As Byte
  534.    Dim Gbg              As Byte
  535.    Dim Rbg              As Byte
  536.    Dim savAlpha(1 To 4) As Byte
  537.    Dim Cl               As Long
  538.    Dim Strength         As Long
  539.    Dim StrengthI        As Long
  540.    Dim Radius           As Long
  541.    Dim RX1              As Long
  542.    Dim RX2              As Long
  543.    Dim RY1              As Long
  544.    Dim RY2              As Long
  545.    Dim savX(1 To 4)     As Long
  546.    Dim savY(1 To 4)     As Long
  547.    Dim X4               As Long
  548.    Dim Y4               As Long
  549.    Dim Ax               As Single
  550.    Dim Ay               As Single
  551.    Dim Bx               As Single
  552.    Dim By               As Single
  553.    Dim L1               As Single
  554.    Dim L2               As Single
  555.    Dim L3               As Single
  556.    Dim L4               As Single
  557.    Dim sngAngle         As Single
  558.    Dim sngPointSpacing  As Single
  559.    Dim X2               As Single
  560.    Dim Xp5              As Single
  561.    Dim Y2               As Single
  562.  
  563. On Error Resume Next
  564.  
  565.    If Not InDIBits Then
  566.       MsgBox "You must create a DIB array" & vbCrLf & _
  567.          "before calling CircleDIB."
  568.       Exit Sub
  569.    End If
  570.  
  571.    SetRGBComponents Color
  572.  
  573.    Radius = RadiusX
  574.    If RadiusY > RadiusX Then
  575.       Radius = RadiusY
  576.    End If
  577.  
  578.    sngPointSpacing = GetPointSpacing(Radius, Thickness)
  579.  
  580.    If StartAngle > StopAngle Then
  581.       StopAngle = StopAngle + 360
  582.    End If
  583.    'Convert to Radians
  584.    StartAngle = StartAngle * Rads
  585.    StopAngle = StopAngle * Rads
  586.  
  587.    For sngAngle = StartAngle To StopAngle Step sngPointSpacing
  588.       X2 = RadiusX * Cos(sngAngle - HalfPi)
  589.       Y2 = RadiusY * Sin(sngAngle + HalfPi)
  590.       'Prevents error when vb rounds .5 down
  591.       If X2 = Int(X2) Then X2 = X2 + 0.001
  592.       If Y2 = Int(Y2) Then Y2 = Y2 + 0.001
  593.       Ax = X2 + X1 - 0.5
  594.       Ay = Y2 + Y1 - 0.5
  595.       Bx = Ax + 1
  596.       By = Ay + 1
  597.       RX1 = Ax
  598.       RX2 = RX1 + 1
  599.       Xp5 = RX1 + 0.5
  600.       RY1 = Ay
  601.       RY2 = By
  602.       L1 = RY1 + 0.5 - Ay
  603.       L2 = 256 * (Xp5 - Ax) - Xp5 + Ax
  604.       L3 = 255 - L2
  605.       L4 = By - RY2 + 0.5
  606.       savX(1) = RX1
  607.       savY(1) = RY1
  608.       savX(2) = RX2
  609.       savY(2) = RY1
  610.       savY(3) = RY2
  611.       savX(3) = RX1
  612.       savY(4) = RY2
  613.       savX(4) = RX2
  614.       savAlpha(1) = L1 * L2
  615.       savAlpha(2) = L1 * L3
  616.       savAlpha(3) = L4 * L2
  617.       savAlpha(4) = L4 * L3
  618.  
  619.       For Cl = 1 To 4
  620.          Strength = savAlpha(Cl)
  621.          X4 = savX(Cl)
  622.          Y4 = savY(Cl)
  623.          'Check if in bounds
  624.          If X4 >= 0 And X4 < m_W1 And Y4 >= 0 And Y4 <= m_H1 Then
  625.             If Strength > 252 Then  '> 99%
  626.                'No blending
  627.                buf(X4, Y4).Blue = Blue
  628.                buf(X4, Y4).Green = Green
  629.                buf(X4, Y4).Red = Red
  630.             Else
  631.                Bbg = buf(X4, Y4).Blue
  632.                Gbg = buf(X4, Y4).Green
  633.                Rbg = buf(X4, Y4).Red
  634.                'Blend % of bgColor with % of Color
  635.                StrengthI = 255 - Strength
  636.                buf(X4, Y4).Red = (StrengthI * Rbg + Strength * Red) \ 256
  637.                buf(X4, Y4).Green = (StrengthI * Gbg + Strength * Green) \ 256
  638.                buf(X4, Y4).Blue = (StrengthI * Bbg + Strength * Blue) \ 256
  639.             End If
  640.          End If
  641.       Next
  642.    Next
  643. End Sub
  644.  
  645. Public Sub SetRGBComponents(ByVal Color As OLE_COLOR)
  646.  
  647.    Color = TranslateColour(Color)
  648.    m_Color = Color 'make available global
  649.    If Color Then
  650.       Red = Color And &HFF&
  651.       Green = Color \ 256 And &HFF
  652.       Blue = Color \ 65536
  653.    Else 'Color is Black
  654.       Red = 0
  655.       Green = 0
  656.       Blue = 0
  657.    End If
  658. End Sub
  659.  
  660. Public Sub LineGP(ByVal hdc As Long, _
  661.    ByVal X1 As Integer, _
  662.    ByVal Y1 As Integer, _
  663.    ByVal X2 As Integer, _
  664.    ByVal Y2 As Integer, _
  665.    ByVal Color As OLE_COLOR)
  666.  
  667.    Dim XScope           As Long
  668.    Dim YScope           As Long
  669.    Dim XDir             As Long
  670.    Dim YDir             As Long
  671.    Dim LinearDeviance   As Long
  672.    Dim Counter          As Long
  673.    Dim AntiAliasStrength As Long
  674.    Dim EndPointIntensity As Long
  675.  
  676.    Const HalfIntensity As Long = 127
  677.  
  678.    'Blended lines, maximum blend at transition,
  679.    'tapering off too minimum.
  680.    '
  681.    '            ----------
  682.    'Min    Max/Max     Min
  683.    '----------
  684.    '
  685.    m_hDC = hdc
  686.    m_Color = Color
  687.  
  688.    XScope = X2 - X1
  689.    YScope = Y2 - Y1
  690.  
  691.    If XScope < 0 Then
  692.       XScope = Abs(XScope)
  693.       XDir = -1
  694.    Else
  695.       XDir = 1
  696.    End If
  697.  
  698.    If YScope < 0 Then
  699.       YScope = Abs(YScope)
  700.       YDir = -1
  701.    Else
  702.       YDir = 1
  703.    End If
  704.  
  705.    If XScope + YScope = 0 Then
  706.       'Exit if line length is 0
  707.       Exit Sub
  708.    End If
  709.  
  710.    SetRGBComponents Color
  711.  
  712.    If XScope > YScope Then
  713.       'Output EndPoints outside of main loop.
  714.       EndPointIntensity = (85 * YScope) \ XScope
  715.       PutPixelGP X1 - XDir, Y1 - YDir, EndPointIntensity
  716.       PutPixelGP X1 - XDir, Y1, HalfIntensity
  717.       PutPixelGP X2 + XDir, Y2 + YDir, EndPointIntensity
  718.       PutPixelGP X2 + XDir, Y2, HalfIntensity
  719.       '-----
  720.       LinearDeviance = XScope \ 2
  721.       For Counter = 0 To XScope
  722.          'Main line, output full strength direct to hDC.
  723.          SetPixelV m_hDC, X1, Y1, m_Color
  724.          'Output the blended lines for anti-alias effect.
  725.          AntiAliasStrength = (LinearDeviance * 255) \ XScope
  726.          PutPixelGP X1, Y1 - YDir, 255 - AntiAliasStrength
  727.          PutPixelGP X1, Y1 + YDir, AntiAliasStrength
  728.          LinearDeviance = (LinearDeviance + YScope)
  729.          If LinearDeviance >= XScope Then
  730.             LinearDeviance = LinearDeviance - XScope
  731.             Y1 = Y1 + YDir
  732.          End If
  733.          X1 = X1 + XDir
  734.       Next
  735.    Else
  736.       'Output EndPoints outside of main loop.
  737.       EndPointIntensity = (85 * XScope) \ YScope
  738.       PutPixelGP X1 - XDir, Y1 - YDir, EndPointIntensity
  739.       PutPixelGP X1, Y1 - YDir, HalfIntensity
  740.       PutPixelGP X2 + XDir, Y2 + YDir, EndPointIntensity
  741.       PutPixelGP X2, Y2 + YDir, HalfIntensity
  742.       '-----
  743.       LinearDeviance = YScope \ 2
  744.       For Counter = 0 To YScope
  745.          'Main line, output full strength direct to hDC.
  746.          SetPixelV m_hDC, X1, Y1, m_Color
  747.          'Output the blended lines for anti-alias effect.
  748.          AntiAliasStrength = (LinearDeviance * 255) \ YScope
  749.          PutPixelGP X1 - XDir, Y1, 255 - AntiAliasStrength
  750.          PutPixelGP X1 + XDir, Y1, AntiAliasStrength
  751.          LinearDeviance = LinearDeviance + XScope
  752.          If (LinearDeviance >= YScope) Then
  753.             LinearDeviance = LinearDeviance - YScope
  754.             X1 = X1 + XDir
  755.          End If
  756.          Y1 = Y1 + YDir
  757.       Next
  758.    End If
  759.  
  760. End Sub
  761.  
  762. Public Sub LineDIB(ByVal X1 As Integer, _
  763.    ByVal Y1 As Integer, _
  764.    ByVal X2 As Integer, _
  765.    ByVal Y2 As Integer, _
  766.    ByVal Color As OLE_COLOR)
  767.  
  768.    'Blended lines, maximum blend at transition,
  769.    'tapering off too minimum.
  770.    '
  771.    '            ----------
  772.    'Min    Max/Max     Min
  773.    '----------
  774.    '
  775.  
  776.    If Not InDIBits Then
  777.       MsgBox "You must create a DIB array" & vbCrLf & _
  778.          "before calling LineDIB."
  779.       Exit Sub
  780.    End If
  781.  
  782.    Dim XScope           As Long
  783.    Dim YScope           As Long
  784.    Dim XDir             As Long
  785.    Dim YDir             As Long
  786.    Dim LinearDeviance   As Long
  787.    Dim Counter          As Long
  788.    Dim AntiAliasStrength As Long
  789.    Dim EndPointIntensity As Long
  790.  
  791.    Const HalfIntensity As Long = 127
  792.  
  793.    XScope = X2 - X1
  794.    YScope = Y2 - Y1
  795.  
  796.    If XScope < 0 Then
  797.       XScope = Abs(XScope)
  798.       XDir = -1
  799.    Else
  800.       XDir = 1
  801.    End If
  802.  
  803.    If YScope < 0 Then
  804.       YScope = Abs(YScope)
  805.       YDir = -1
  806.    Else
  807.       YDir = 1
  808.    End If
  809.  
  810.    If XScope + YScope = 0 Then
  811.       'Exit if line length is 0
  812.       Exit Sub
  813.    End If
  814.  
  815.    SetRGBComponents Color
  816.  
  817.    If XScope > YScope Then
  818.       'Output EndPoints outside of main loop.
  819.       EndPointIntensity = (85 * YScope) \ XScope
  820.       PutPixelDIB X1 - XDir, Y1 - YDir, EndPointIntensity
  821.       PutPixelDIB X1 - XDir, Y1, HalfIntensity
  822.       PutPixelDIB X2 + XDir, Y2 + YDir, EndPointIntensity
  823.       PutPixelDIB X2 + XDir, Y2, HalfIntensity
  824.       '-----
  825.       LinearDeviance = XScope \ 2
  826.       For Counter = 0 To XScope
  827.          'Main line, output full strength direct to DIB array.
  828.          PutPixelDIB X1, Y1, 255
  829.          'Output the blended lines for anti-alias effect.
  830.          AntiAliasStrength = (LinearDeviance * 255) \ XScope
  831.          PutPixelDIB X1, Y1 - YDir, 255 - AntiAliasStrength
  832.          PutPixelDIB X1, Y1 + YDir, AntiAliasStrength
  833.          LinearDeviance = (LinearDeviance + YScope)
  834.          If LinearDeviance >= XScope Then
  835.             LinearDeviance = LinearDeviance - XScope
  836.             Y1 = Y1 + YDir
  837.          End If
  838.          X1 = X1 + XDir
  839.       Next
  840.    Else
  841.       'Output EndPoints outside of main loop.
  842.       EndPointIntensity = (85 * XScope) \ YScope
  843.       PutPixelDIB X1 - XDir, Y1 - YDir, EndPointIntensity
  844.       PutPixelDIB X1, Y1 - YDir, HalfIntensity
  845.       PutPixelDIB X2 + XDir, Y2 + YDir, EndPointIntensity
  846.       PutPixelDIB X2, Y2 + YDir, HalfIntensity
  847.       '-----
  848.       LinearDeviance = YScope \ 2
  849.       For Counter = 0 To YScope
  850.          'Main line, output full strength direct to DIB array.
  851.          PutPixelDIB X1, Y1, 255
  852.          'Output the blended lines for anti-alias effect.
  853.          AntiAliasStrength = (LinearDeviance * 255) \ YScope
  854.          PutPixelDIB X1 - XDir, Y1, 255 - AntiAliasStrength
  855.          PutPixelDIB X1 + XDir, Y1, AntiAliasStrength
  856.          LinearDeviance = LinearDeviance + XScope
  857.          If (LinearDeviance >= YScope) Then
  858.             LinearDeviance = LinearDeviance - YScope
  859.             X1 = X1 + XDir
  860.          End If
  861.          Y1 = Y1 + YDir
  862.       Next
  863.    End If
  864.  
  865. End Sub
  866.  
  867. Public Sub Array2Pic()
  868.    'If we have an array copy back to hDC
  869.    If InDIBits Then
  870.       SetDIBits m_hDC, m_Handle, 0, m_H1, buf(0, 0), Binfo, DIB_RGB_COLORS
  871.       InDIBits = False
  872.       'Erase buf '* Moved to Class_Terminate
  873.    End If
  874. End Sub
  875.  
  876. Private Sub PutPixelGP(ByVal X As Long, _
  877.    ByVal Y As Long, _
  878.    ByVal Strength As Long)
  879.  
  880.    Dim Color            As Long
  881.    Dim bgColor          As Long
  882.    Dim Rbg              As Long
  883.    Dim Gbg              As Long
  884.    Dim Bbg              As Long
  885.    Dim Rblend           As Long
  886.    Dim Gblend           As Long
  887.    Dim Bblend           As Long
  888.    Dim StrengthI        As Long
  889.  
  890.    If Strength > 252 Then '99%
  891.       SetPixelV m_hDC, X, Y, m_Color
  892.    Else
  893.       '##### Get Background Pixel components
  894.       bgColor = GetPixel(m_hDC, X, Y)
  895.       If bgColor Then 'i.e. Not Black
  896.          Rbg = bgColor And &HFF&
  897.          Gbg = (bgColor And &HFF00&) \ &H100&
  898.          Bbg = (bgColor And &HFF0000) \ &H10000
  899.       End If
  900.       '##### Blend % of bgColor with % of m_Color
  901.       StrengthI = 255 - Strength
  902.       Rblend = StrengthI * Rbg + Strength * Red
  903.       Gblend = StrengthI * Gbg + Strength * Green
  904.       Bblend = StrengthI * Bbg + Strength * Blue
  905.       '##### Write
  906.       Color = RGB(Rblend \ 256, Gblend \ 256, Bblend \ 256)
  907.       SetPixelV m_hDC, X, Y, Color
  908.    End If
  909.  
  910. End Sub
  911.  
  912. Private Sub PutPixelDIB(ByVal X As Long, _
  913.    ByVal Y As Long, _
  914.    ByVal Strength As Long)
  915.  
  916.    Dim Rbg              As Long
  917.    Dim Gbg              As Long
  918.    Dim Bbg              As Long
  919.    Dim StrengthI        As Long
  920.  
  921.    'Check if in bounds
  922.    If X < 0 Or X >= m_W1 Or Y < 0 Or Y > m_H1 Then
  923.       Exit Sub
  924.    End If
  925.    If Strength > 252 Then '99%
  926.       buf(X, Y).Blue = Blue
  927.       buf(X, Y).Green = Green
  928.       buf(X, Y).Red = Red
  929.    Else
  930.       '##### Get Background Pixel components
  931.       Bbg = buf(X, Y).Blue
  932.       Gbg = buf(X, Y).Green
  933.       Rbg = buf(X, Y).Red
  934.       '##### Blend % of bgColor with % of m_Color
  935.       StrengthI = 255 - Strength
  936.       buf(X, Y).Red = (StrengthI * Rbg + Strength * Red) \ 256
  937.       buf(X, Y).Green = (StrengthI * Gbg + Strength * Green) \ 256
  938.       buf(X, Y).Blue = (StrengthI * Bbg + Strength * Blue) \ 256
  939.    End If
  940. End Sub
  941.  
  942. Private Sub Class_Terminate()
  943.    Erase buf()
  944. End Sub
  945.