📄 modparsers.bas
字号:
If Not LB = 0& Then FreeLibrary LB
iparseValidateZLIB = (Not (Version = 0&))
End Function
Public Sub iparseValidateAlphaChannel(inStream() As Byte, bPreMultiply As Boolean, bIsAlpha As Boolean, imgType As Long)
' Purpose: Modify 32bpp DIB's alpha bytes depending on whether or not they are used
' Parameters
' inStream(). 2D array overlaying the DIB to be checked
' bPreMultiply. If true, image will be premultiplied if not already
' bIsAlpha. Returns whether or not the image contains transparency
' imgType. If passed as -1 then image is known to be not alpha, but will have its alpha values set to 255
' When routine returns, imgType is either imgBmpARGB, imgBmpPARGB or imgBitmap
Dim X As Long, Y As Long
Dim lPARGB As Long, zeroCount As Long, opaqueCount As Long
Dim bPARGB As Boolean, bAlpha As Boolean
' see if the 32bpp is premultiplied or not and if it is alpha or not
If Not imgType = -1 Then
For Y = 0 To UBound(inStream, 2)
For X = 3 To UBound(inStream, 1) Step 4
Select Case inStream(X, Y)
Case 0
If lPARGB = 0 Then
' zero alpha, if any of the RGB bytes are non-zero, then this is not pre-multiplied
If Not inStream(X - 1, Y) = 0 Then
lPARGB = 1 ' not premultiplied
ElseIf Not inStream(X - 2, Y) = 0 Then
lPARGB = 1
ElseIf Not inStream(X - 3, Y) = 0 Then
lPARGB = 1
End If
' but don't exit loop until we know if any alphas are non-zero
End If
zeroCount = zeroCount + 1 ' helps in decision factor at end of loop
Case 255
' no way to indicate if premultiplied or not, unless...
If lPARGB = 1 Then
lPARGB = 2 ' not pre-multiplied because of the zero check above
Exit For
End If
opaqueCount = opaqueCount + 1
Case Else
' if any Exit For's below get triggered, not pre-multiplied
If lPARGB = 1 Then
lPARGB = 2: Exit For
ElseIf inStream(X - 3, Y) > inStream(X, Y) Then
lPARGB = 2: Exit For
ElseIf inStream(X - 2, Y) > inStream(X, Y) Then
lPARGB = 2: Exit For
ElseIf inStream(X - 1, Y) > inStream(X, Y) Then
lPARGB = 2: Exit For
End If
End Select
Next
If lPARGB = 2 Then Exit For
Next
' if we got all the way thru the image without hitting Exit:For then
' the image is not alpha unless the bAlpha flag was set in the loop
If zeroCount = (X \ 4) * (UBound(inStream, 2) + 1) Then ' every alpha value was zero
bPARGB = False: bAlpha = False ' assume RGB, else 100% transparent ARGB
' also if lPARGB=0, then image is completely black
ElseIf opaqueCount = (X \ 4) * (UBound(inStream, 2) + 1) Then ' every alpha is 255
bPARGB = False: bAlpha = False
Else
Select Case lPARGB
Case 2: bPARGB = False: bAlpha = True ' 100% positive ARGB
Case 1: bPARGB = False: bAlpha = True ' now 100% positive ARGB
Case 0: bPARGB = True: bAlpha = True
End Select
End If
End If
' see if caller wants the non-premultiplied alpha channel premultiplied
If bAlpha = True Then
If bPARGB Then ' else force premultiplied
imgType = imgBmpPARGB
Else
imgType = imgBmpARGB
If bPreMultiply = True Then
For Y = 0 To UBound(inStream, 2)
For X = 3 To UBound(inStream, 1) Step 4
If inStream(X, Y) = 0 Then
CopyMemory inStream(X - 3, Y), 0&, 4&
ElseIf Not inStream(X, Y) = 255 Then
For lPARGB = X - 3 To X - 1
inStream(lPARGB, Y) = ((0& + inStream(lPARGB, Y)) * inStream(X, Y)) \ &HFF
Next
End If
Next
Next
bAlpha = True
End If
End If
Else
imgType = imgBitmap
If bPreMultiply = True Then
For Y = 0 To UBound(inStream, 2)
For X = 3 To UBound(inStream, 1) Step 4
inStream(X, Y) = 255
Next
Next
End If
End If
bIsAlpha = bAlpha
End Sub
Public Sub iparseGrayScaleRatios(Formula As eGrayScaleFormulas, R As Single, G As Single, B As Single)
Select Case Formula ' note: when adding your own formulas, ensure they add up to 1.0 or less
Case gsclNone ' no grayscale
R = 1: G = 1: B = 1
Case gsclNTSCPAL
R = 0.299: G = 0.587: B = 0.114 ' standard weighted average
Case gsclSimpleAvg
R = 0.333: G = 0.334: B = R ' pure average
Case gsclCCIR709
R = 0.213: G = 0.715: B = 0.072 ' Formula.CCIR 709, Default
Case gsclRedMask
R = 0.8: G = 0.1: B = G ' personal preferences: could be r=1:g=0:b=0 or other weights
Case gsclGreenMask
R = 0.1: G = 0.8: B = R ' personal preferences: could be r=0:g=1:b=0 or other weights
Case gsclBlueMask
R = 0.1: G = R: B = 0.8 ' personal preferences: could be r=0:g=0:b=1 or other weights
Case gsclBlueGreenMask
R = 0.1: G = 0.45: B = G ' personal preferences: could be r=0:g=.5:b=.5 or other weights
Case gsclRedGreenMask
R = 0.45: G = R: B = 0.1 ' personal preferences: could be r=.5:g=.5:b=0 or other weights
Case Else
R = 0.299: G = 0.587: B = 0.114 ' use gsclNTSCPAL
End Select
End Sub
Public Function iparseSafeOffset(ByVal Ptr As Long, Offset As Long) As Long
' ref http://support.microsoft.com/kb/q189323/ ' unsigned math
' Purpose: Provide a valid pointer offset
' If a pointer +/- the offset wraps around the high bit of a long, the
' pointer needs to change from positive to negative or vice versa.
' A return of zero indicates the offset exceeds the min/max unsigned long bounds
Const MAXINT_4NEG As Long = -2147483648#
Const MAXINT_4 As Long = 2147483647
If Offset = 0 Then
iparseSafeOffset = Ptr
Else
If Offset < 0 Then ' subtracting from pointer
If Ptr < MAXINT_4NEG - Offset Then
' wraps around high bit (backwards) & changes to Positive from Negative
iparseSafeOffset = MAXINT_4 - ((MAXINT_4NEG - Ptr) - Offset - 1)
ElseIf Ptr > 0 Then ' verify pointer does not wrap around 0 bit
If Ptr > -Offset Then iparseSafeOffset = Ptr + Offset
Else
iparseSafeOffset = Ptr + Offset
End If
Else ' Adding to pointer
If Ptr > MAXINT_4 - Offset Then
' wraps around high bit (forward) & changes to Negative from Positive
iparseSafeOffset = MAXINT_4NEG + (Offset - (MAXINT_4 - Ptr) - 1)
ElseIf Ptr < 0 Then ' verify pointer does not wrap around 0 bit
If Ptr < -Offset Then iparseSafeOffset = Ptr + Offset
Else
iparseSafeOffset = Ptr + Offset
End If
End If
End If
End Function
Public Function iparseGetFileHandle(ByVal FileName As String, bOpen As Boolean, Optional ByVal useUnicode As Boolean = False) As Long
' Function uses APIs to read/create files with unicode support
Const GENERIC_READ As Long = &H80000000
Const OPEN_EXISTING = &H3
Const FILE_SHARE_READ = &H1
Const GENERIC_WRITE As Long = &H40000000
Const FILE_SHARE_WRITE As Long = &H2
Const CREATE_ALWAYS As Long = 2
Const FILE_ATTRIBUTE_ARCHIVE As Long = &H20
Const FILE_ATTRIBUTE_HIDDEN As Long = &H2
Const FILE_ATTRIBUTE_READONLY As Long = &H1
Const FILE_ATTRIBUTE_SYSTEM As Long = &H4
Dim Flags As Long, Access As Long
Dim Disposition As Long, Share As Long
If useUnicode = False Then useUnicode = (Not (IsWindowUnicode(GetDesktopWindow) = 0&))
If bOpen Then
Access = GENERIC_READ
Share = FILE_SHARE_READ
Disposition = OPEN_EXISTING
Flags = FILE_ATTRIBUTE_ARCHIVE Or FILE_ATTRIBUTE_HIDDEN Or FILE_ATTRIBUTE_NORMAL _
Or FILE_ATTRIBUTE_READONLY Or FILE_ATTRIBUTE_SYSTEM
Else
Access = GENERIC_READ Or GENERIC_WRITE
Share = 0&
If useUnicode Then
Flags = GetFileAttributesW(StrPtr(FileName))
Else
Flags = GetFileAttributes(FileName)
End If
If Flags < 0& Then Flags = FILE_ATTRIBUTE_NORMAL
' CREATE_ALWAYS will delete previous file if necessary
Disposition = CREATE_ALWAYS
End If
If useUnicode Then
iparseGetFileHandle = CreateFileW(StrPtr(FileName), Access, Share, ByVal 0&, Disposition, Flags, 0&)
Else
iparseGetFileHandle = CreateFile(FileName, Access, Share, ByVal 0&, Disposition, Flags, 0&)
End If
End Function
Public Function iparseDeleteFile(FileName As String, Optional ByVal useUnicode As Boolean = False) As Boolean
' Function uses APIs to delete files with unicode support
If useUnicode = False Then useUnicode = (Not (IsWindowUnicode(GetDesktopWindow) = 0&))
If useUnicode Then
If Not (SetFileAttributesW(StrPtr(FileName), FILE_ATTRIBUTE_NORMAL) = 0&) Then
iparseDeleteFile = Not (DeleteFileW(StrPtr(FileName)) = 0&)
End If
Else
If Not (SetFileAttributes(FileName, FILE_ATTRIBUTE_NORMAL) = 0&) Then
iparseDeleteFile = Not (DeleteFile(FileName) = 0&)
End If
End If
End Function
Public Function iparseFileExists(FileName As String, Optional ByVal useUnicode As Boolean) As Boolean
' test to see if a file exists
Const INVALID_HANDLE_VALUE = -1&
If useUnicode = False Then useUnicode = (Not (IsWindowUnicode(GetDesktopWindow) = 0&))
If useUnicode Then
iparseFileExists = Not (GetFileAttributesW(StrPtr(FileName)) = INVALID_HANDLE_VALUE)
Else
iparseFileExists = Not (GetFileAttributes(FileName) = INVALID_HANDLE_VALUE)
End If
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -