home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 5_2007-2008.ISO / data / Zips / A_200_segm204037122007.psc / clsLightSpeed8.cls < prev    next >
Text File  |  2007-01-02  |  18KB  |  447 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 = "clsLightSpeed8"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Option Explicit
  15. Option Base 0
  16.  
  17. 'Email: jason_bullen@yahoo.com
  18. 'Copyright Jason Bullen November 2003. All right reserved.
  19. 'This source code is copyrighted material which may not be published
  20. ' in any form without explicit prior permission from the author.
  21.  
  22.  
  23. ' Set this to TRUE to check initialization and function parameters
  24. #Const DEBUGGING = False
  25.  
  26.  
  27. ' Remember initialize picturebox
  28. Private mPicBoxDC As Long
  29. ' Handles
  30. Private mDC As Long
  31. Private mBitmap As Long
  32. ' The format descriptor
  33. Private mBmpInfo As tBitmapInfo
  34. ' Frequently used
  35. Private mBufferWidth As Integer
  36. Private mBufferHeight As Integer
  37. Private mBufferPitch As Long
  38. Private mBufferSize As Long
  39. ' The RGB data
  40. Private mBitsPointer As Long
  41. ' The palette
  42. Private mPalette(0 To 255) As tRgbQuad
  43.  
  44.  
  45.  
  46. ' WIN32
  47. '-------------------------------------------------------------------------------------------------
  48. Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
  49. Private Declare Function CreateDIBSection Lib "gdi32" (ByVal hdc As Long, pBitmapInfo As tBitmapInfo, ByVal un As Long, ByVal lplpVoid As Long, ByVal handle As Long, ByVal dw As Long) As Long
  50. Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
  51. Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
  52. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  53. Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
  54. Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (Destination As Any, ByVal Length As Long)
  55. Private Declare Sub FillMemory Lib "kernel32.dll" Alias "RtlFillMemory" (Destination As Any, ByVal Length As Long, ByVal Fill As Byte)
  56. Private Declare Function GetDIBColorTable Lib "gdi32" (ByVal hdc As Long, ByVal first As Long, ByVal count As Long, pRGBQuad As tRgbQuad) As Long
  57. Private Declare Function SetDIBColorTable Lib "gdi32" (ByVal hdc As Long, ByVal first As Long, ByVal count As Long, pcRGBQuad As tRgbQuad) As Long
  58. Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Var() As Any) As Long
  59. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
  60.  
  61. Private Const BI_RGB As Long = 0
  62. Private Const DIB_RGB_COLORS As Long = 0
  63. Private Const DIB_PAL_COLORS As Long = 1
  64.  
  65. Private Type tBitmapInfoHeader
  66.         biSize As Long
  67.         biWidth As Long
  68.         biHeight As Long
  69.         biPlanes As Integer
  70.         biBitCount As Integer
  71.         biCompression As Long
  72.         biSizeImage As Long
  73.         biXPelsPerMeter As Long
  74.         biYPelsPerMeter As Long
  75.         biClrUsed As Long
  76.         biClrImportant As Long
  77. End Type
  78.  
  79. Private Type tRgbQuad
  80.         rgbBlue As Byte
  81.         rgbGreen As Byte
  82.         rgbRed As Byte
  83.         rgbReserved As Byte
  84. End Type
  85.  
  86. Private Type tBitmapInfo
  87.         bmiHeader As tBitmapInfoHeader
  88.         bmiColors As tRgbQuad
  89. End Type
  90.  
  91. Private Const NoExtraCheck As Integer = 1
  92.  
  93.  
  94. '-------------------------------------------------------------------------------------------------
  95. ' INITIALIZERS
  96. '-------------------------------------------------------------------------------------------------
  97. Public Function InitPicture(picBox As PictureBox, grabSource As Boolean) As Boolean
  98. #If DEBUGGING Then
  99.     If mDC Then
  100.         Call Err.Raise(1, "clsLightSpeed8", "CLASS ALREADY INITIALIZED!!!")
  101.     End If
  102. #End If
  103.     mPicBoxDC = picBox.hdc
  104.     mBufferWidth = (picBox.ScaleWidth + 3) And &HFFFFFFFC    'This rounds UP to the next 4 pixels
  105.     mBufferPitch = mBufferWidth
  106.     mBufferHeight = picBox.ScaleHeight
  107.     With mBmpInfo.bmiHeader
  108.         .biSize = Len(mBmpInfo.bmiHeader)
  109.         .biWidth = mBufferWidth
  110.         .biHeight = -mBufferHeight      '-' makes the picture TOP-DOWN in memory
  111.         .biPlanes = 1
  112.         .biBitCount = 8
  113.         .biCompression = BI_RGB
  114.         .biSizeImage = mBufferPitch * -.biHeight
  115.     End With
  116.  
  117.     mBufferSize = CLng(mBufferWidth) * CLng(mBufferHeight)
  118.  
  119.     mDC = CreateCompatibleDC(mPicBoxDC)
  120.     If mDC Then
  121.         mBitmap = CreateDIBSection(mDC, mBmpInfo, DIB_RGB_COLORS, VarPtr(mBitsPointer), ByVal 0&, ByVal 0&)
  122.         If mBitmap Then
  123.             Call SelectObject(mDC, mBitmap)
  124.             If grabSource Then
  125.                 Call BitBlt(mDC, 0, 0, mBufferWidth, mBufferHeight, mPicBoxDC, 0, 0, vbSrcCopy)
  126.             End If
  127.             InitPicture = False ' no error
  128.             Exit Function
  129.         End If
  130.         DeleteDC mDC
  131.     End If
  132.     mDC = 0
  133.     mBitmap = 0
  134.     mPicBoxDC = 0
  135.     InitPicture = True
  136. #If DEBUGGING Then
  137.     Call Err.Raise(1, "clsLightSpeed8", "InitPicture FAILED")
  138. #End If
  139. End Function
  140.  
  141.  
  142. Public Function InitDimensions(ByVal width As Integer, ByVal height As Integer) As Boolean
  143. #If DEBUGGING Then
  144.     If mDC Then
  145.         Call Err.Raise(1, "clsLightSpeed8", "CLASS ALREADY INITIALIZED!!!")
  146.     End If
  147. #End If
  148.     mPicBoxDC = 0
  149.     mBufferWidth = (width + 3) And &HFFFFFFFC    'This rounds UP to the next 4 pixels
  150.     mBufferPitch = mBufferWidth
  151.     mBufferHeight = height
  152.     With mBmpInfo.bmiHeader
  153.         .biSize = Len(mBmpInfo.bmiHeader)
  154.         .biWidth = mBufferWidth
  155.         .biHeight = -mBufferHeight      '-' makes the picture TOP-DOWN in memory
  156.         .biPlanes = 1
  157.         .biBitCount = 8
  158.         .biCompression = BI_RGB
  159.     End With
  160.  
  161.     mBufferSize = CLng(mBufferWidth) * CLng(mBufferHeight)
  162.  
  163.     mDC = CreateCompatibleDC(mPicBoxDC)
  164.     If mDC Then
  165.         mBitmap = CreateDIBSection(mDC, mBmpInfo, DIB_RGB_COLORS, VarPtr(mBitsPointer), ByVal 0&, ByVal 0&)
  166.         If mBitmap Then
  167.             Call SelectObject(mDC, mBitmap)
  168.             InitDimensions = False ' no error
  169.             Exit Function
  170.         End If
  171.         DeleteDC mDC
  172.     End If
  173.     mDC = 0
  174.     mBitmap = 0
  175.     InitDimensions = True
  176. #If DEBUGGING Then
  177.     Call Err.Raise(1, "clsLS", "InitDimensions FAILED")
  178. #End If
  179. End Function
  180.  
  181.  
  182. '-------------------------------------------------------------------------------------------------
  183. 'PROPERTIES
  184. '-------------------------------------------------------------------------------------------------
  185. Public Property Get GetPointer() As Long
  186.     Call IsClassInitializedRaiseError(NoExtraCheck, "GetPointer")
  187.     GetPointer = mBitsPointer
  188. End Property
  189.  
  190. Public Property Get GetWidth() As Integer
  191.     Call IsClassInitializedRaiseError(NoExtraCheck, "GetWidth")
  192.     GetWidth = mBufferWidth
  193. End Property
  194.  
  195. Public Property Get GetPitch() As Integer
  196.     Call IsClassInitializedRaiseError(NoExtraCheck, "GetPitch")
  197.     GetPitch = mBufferPitch
  198. End Property
  199.  
  200. Public Property Get GetHeight() As Integer
  201.     Call IsClassInitializedRaiseError(NoExtraCheck, "GetHeight")
  202.     GetHeight = mBufferHeight
  203. End Property
  204.  
  205. Public Property Get GetDC() As Long
  206.     Call IsClassInitializedRaiseError(NoExtraCheck, "GetDC")
  207.     GetDC = mDC
  208. End Property
  209.  
  210. Public Property Set SetPictureBox(newValue As PictureBox)
  211.     mPicBoxDC = newValue.hdc
  212. End Property
  213.  
  214.  
  215. '-------------------------------------------------------------------------------------------------
  216. 'PALETTE
  217. '-------------------------------------------------------------------------------------------------
  218. Public Sub ReadPaletteFile(fileName As String)
  219.     Dim fileNum As Integer
  220.     Dim readStr As String * 768
  221.     Dim i As Integer, j As Integer, c As Byte
  222.     
  223. #If DEBUGGING Then
  224.     If Dir(fileName) = "" Then
  225.         Call Err.Raise(1, "clsLightSpeed8", "ReadPaletteFile FAILED")
  226.     End If
  227. #End If
  228.     
  229.     fileNum = FreeFile(0)
  230.     Open fileName For Binary Access Read As #fileNum
  231.     readStr = Input(768, fileNum)
  232.     j = 1
  233.     For i = 0 To 255
  234.         c = Asc(Mid(readStr, j, 1))
  235.         mPalette(i).rgbRed = c
  236.         j = j + 1
  237.         c = Asc(Mid(readStr, j, 1))
  238.         mPalette(i).rgbGreen = c
  239.         j = j + 1
  240.         c = Asc(Mid(readStr, j, 1))
  241.         mPalette(i).rgbBlue = c
  242.         j = j + 1
  243.     Next
  244.     Close fileNum
  245. End Sub
  246.  
  247. Public Sub SetPaletteColor(index As Integer, red As Integer, green As Integer, blue As Integer)
  248. #If DEBUGGING Then
  249.     If index < 0 Or index > 255 Or _
  250.         red < 0 Or red > 255 Or _
  251.         green < 0 Or green > 255 Or _
  252.         blue < 0 Or blue > 255 Then
  253.             Call Err.Raise(1, "clsLightSpeed8", "SetPaletteColor FAILED")
  254.     End If
  255. #End If
  256.     mPalette(index).rgbRed = red
  257.     mPalette(index).rgbGreen = green
  258.     mPalette(index).rgbBlue = blue
  259. End Sub
  260.  
  261. Public Sub SetPalette(first As Integer, count As Integer)
  262.     Call IsClassInitializedRaiseError(NoExtraCheck, "SetPalette")
  263.     Call SetDIBColorTable(mDC, first, count, mPalette(0))
  264. End Sub
  265.  
  266.  
  267. '-------------------------------------------------------------------------------------------------
  268. ' MODIFY ARRRAY
  269. '-------------------------------------------------------------------------------------------------
  270. ' This function redirects a SINGLE dimension array to access our memory DIB
  271. ' ONLY single dimension arrays can be redirected by this function
  272. ' This is intentional because 2 and 3 dimension arrays are much slower
  273. ' It returns the original memory address which must be recorded and used
  274. ' in the call to FixArray() below
  275. Public Function GetArray(ByRef theArray() As Byte) As Long
  276.     Dim pointer As Long
  277.     
  278.     Call IsClassInitializedRaiseError(NoExtraCheck, "GetArray")
  279.     ReDim theArray(0 To 0) As Byte
  280.     ' Get pointer to safearray structure
  281.     Call CopyMemory(ByVal VarPtr(pointer), ByVal VarPtrArray(theArray()), 4)
  282.     ' Record old data pointer
  283.     Call CopyMemory(ByVal VarPtr(GetArray), ByVal pointer + 12, 4)
  284.     ' Offset to data pointer and change to point to memory bitmap
  285.     Call CopyMemory(ByVal pointer + 12, ByVal VarPtr(mBitsPointer), 4)
  286.     ' Offset to array size and change to match memory bitmap size
  287.     Call CopyMemory(ByVal pointer + 16, ByVal VarPtr(mBufferSize), 4)
  288. End Function
  289.  
  290. ' This function fixes modified arrays by redirecting them to the original
  291. ' memory address.
  292. ' This MUST be done before the App closes or the array is ERASED!!
  293. Public Sub FixArray(ByRef theArray() As Byte, oldPointer As Long)
  294.     Dim pointer As Long, size As Long
  295.     
  296.     Call IsClassInitializedRaiseError(NoExtraCheck, "FixArray")
  297.     Call CopyMemory(ByVal VarPtr(pointer), ByVal VarPtrArray(theArray()), 4)
  298.     Call CopyMemory(ByVal pointer + 12, ByVal VarPtr(oldPointer), 4)
  299.     size = 1
  300.     Call CopyMemory(ByVal pointer + 16, ByVal VarPtr(size), 4)
  301. End Sub
  302.  
  303.  
  304. '-------------------------------------------------------------------------------------------------
  305. ' GRAB - Copy Image Data into Array
  306. ' Copy image data to our memory bitmap (DIB) from various sources
  307. '-------------------------------------------------------------------------------------------------
  308. Public Sub GrabPicture()
  309.     Call IsClassInitializedRaiseError(mPicBoxDC, "GrabPicture")
  310.     Call BitBlt(mDC, 0, 0, mBufferWidth, mBufferHeight, mPicBoxDC, 0, 0, vbSrcCopy)
  311. End Sub
  312.  
  313. Public Sub GrabPictureArea(dstX As Integer, dstY As Integer, _
  314.                            width As Integer, height As Integer, _
  315.                            srcX As Integer, srcY As Integer)
  316.     
  317.     Call IsClassInitializedRaiseError(mPicBoxDC, "GrabPictureArea")
  318.     Call BitBlt(mDC, dstX, dstY, width, height, mPicBoxDC, srcX, srcY, vbSrcCopy)
  319. End Sub
  320.  
  321. Public Sub GrabOtherPicture(picBox As PictureBox)
  322.     Dim width As Integer, height As Integer
  323.     
  324.     Call IsClassInitializedRaiseError(picBox.hdc, "GrabOtherPicture")
  325.     width = picBox.ScaleX(picBox.ScaleWidth, picBox.ScaleMode, vbPixels)
  326.     height = picBox.ScaleY(picBox.ScaleHeight, picBox.ScaleMode, vbPixels)
  327.     Call BitBlt(mDC, 0, 0, width, height, picBox.hdc, 0, 0, vbSrcCopy)
  328. End Sub
  329.  
  330. Public Sub GrabOtherPictureArea(sourceDC As Long, _
  331.                                 dstX As Integer, dstY As Integer, _
  332.                                 width As Integer, height As Integer, _
  333.                                 srcX As Integer, srcY As Integer)
  334.     
  335.     Call IsClassInitializedRaiseError(sourceDC, "GrabOtherPictureArea")
  336.     Call BitBlt(mDC, dstX, dstY, width, height, sourceDC, srcX, srcY, vbSrcCopy)
  337. End Sub
  338.  
  339.  
  340. '-------------------------------------------------------------------------------------------------
  341. ' PUT BITS
  342. ' Copy image data from our memory bitmap (DIB) to various sources
  343. '-------------------------------------------------------------------------------------------------
  344. Public Sub PutPicture()
  345.     Call IsClassInitializedRaiseError(mPicBoxDC, "PutPicture")
  346.     Call BitBlt(mPicBoxDC, 0, 0, mBufferWidth, mBufferHeight, mDC, 0, 0, vbSrcCopy)
  347. End Sub
  348.  
  349. Public Sub PutPictureArea(dstX As Integer, dstY As Integer, _
  350.                           width As Integer, height As Integer, _
  351.                           srcX As Integer, srcY As Integer)
  352.     
  353.     Call IsClassInitializedRaiseError(mPicBoxDC, "PutPictureArea")
  354.     Call BitBlt(mPicBoxDC, dstX, dstY, width, height, mDC, srcX, srcY, vbSrcCopy)
  355. End Sub
  356.  
  357. Public Sub PutOtherPicture(picBox As PictureBox)
  358.     Call IsClassInitializedRaiseError(picBox.hdc, "PutOtherPicture")
  359.     Call BitBlt(picBox.hdc, 0, 0, mBufferWidth, mBufferHeight, mDC, 0, 0, vbSrcCopy)
  360. End Sub
  361.  
  362. Public Sub PutOtherPictureArea(picDC As Long, _
  363.                                dstX As Integer, dstY As Integer, _
  364.                                width As Integer, height As Integer, _
  365.                                srcX As Integer, srcY As Integer)
  366.     Call IsClassInitializedRaiseError(picDC, "PutOtherPictureArea")
  367.     Call BitBlt(picDC, dstX, dstY, width, height, mDC, srcX, srcY, vbSrcCopy)
  368. End Sub
  369.  
  370.  
  371. '-------------------------------------------------------------------------------------------------
  372. ' TERMINATE
  373. '-------------------------------------------------------------------------------------------------
  374. Private Sub Class_Terminate()
  375.     Call Destroy
  376. End Sub
  377.  
  378.  
  379. '-------------------------------------------------------------------------------------------------
  380. ' Destroy Objects and handles
  381. '-------------------------------------------------------------------------------------------------
  382. Public Sub Destroy()
  383.     If mDC Then
  384.         Call DeleteDC(mDC)
  385.         mDC = 0
  386.     End If
  387.     If mBitmap Then
  388.         Call DeleteObject(mBitmap)
  389.         mBitmap = 0
  390.     End If
  391.     mPicBoxDC = 0
  392. End Sub
  393.  
  394.  
  395.  
  396. '-------------------------------------------------------------------------------------------------
  397. ' CLASS INITIALIZED CHECKS
  398. '-------------------------------------------------------------------------------------------------
  399. Private Sub IsClassInitializedRaiseError(extraCheck As Long, text As String)
  400. #If DEBUGGING Then
  401.     If mDC = 0 Or extraCheck = 0 Then
  402.         Call Err.Raise(1, "clsLightSpeed8", "clsLightSpeed8 Not Initialized!" & vbCrLf & "Function: " & text)
  403.     End If
  404. #End If
  405. End Sub
  406.  
  407.  
  408. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  409. ' Direct Image Manipulation Routines - DLL Interface
  410. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  411. 'SHARED PARAMETERS
  412. '-------------------------------------------------------------------------------------------------
  413. '       source                Source LightSpeed class
  414. '       dstBits               Raw image data
  415. '       dstPitch              Distance to next vertical pixel (width+padding)
  416. '       dstX, dstY            Top left destination
  417. '       dstCenX, dstCenY      Offset to destination center (rotation pivot)
  418. '       dstWidth, dstHeight   Size of destination rectangle
  419. '       srcBits               Raw image data
  420. '       srcPitch              Distance to next vertical pixel (width+padding)
  421. '       srcX, srcY            Top left source
  422. '       srcCenX, srcCenY      Offset to source center (rotation pivot)
  423. '       srcWidth, srcHeight   Size of source rectangle
  424. '       angle                 Rotation angle clockwise in Radians
  425. '       zoom                  1.0=normal, 2.0=double scale, 0.5=half scale, etc.
  426. '       colorKey              Ignore the colorKey color (always palette index 0 - for speed)
  427. '       width, height         Size of rectangle
  428.  
  429.  
  430. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  431.  
  432. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  433. 'FILL the AREA with color index ZERO
  434. Public Sub FillZero()
  435.     Call IsClassInitializedRaiseError(mBitsPointer, "FillZero")
  436.     Call ZeroMemory(ByVal mBitsPointer, mBufferSize)
  437. End Sub
  438.  
  439. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  440. 'FILL the AREA with the color
  441. Public Sub FillColor(color As Byte)
  442.     Call IsClassInitializedRaiseError(mBitsPointer, "FillColor")
  443.     Call FillMemory(ByVal mBitsPointer, mBufferSize, color)
  444. End Sub
  445.  
  446.  
  447.