[syslinux] VB Code to convert BMP to LSS for splash screens
Paul Shebanow
pshebanow at iqcorp.com
Tue Sep 30 10:10:52 PDT 2003
The following code can be used to convert a 256 color BMP to LSS format for use as a SYSLINUX/ISOLINUX/PXELINUX Splash screen. The bitmap must be LESS than 640 pixels wide (bug) and only uses the first 16 colors. CorelDraw and PhotoShop are good for re-palletizing and dithering.
Paul Shebanow
pshebanow at iqcorp.com
--- Begin Code ---
Type RGBColor4
cBlue As Byte
cGreen As Byte
cRed As Byte
cReserved As Byte
End Type
Type RGBColor3
cRed As Byte
cGreen As Byte
cBlue As Byte
End Type
Type bmpHeader
fileType As Integer
fileSize As Long
fileReserved1 As Integer
fileReserved2 As Integer
fileOffsetBits As Long
iSize As Long
iWidth As Long
iHeight As Long
iPlanes As Integer
iBitCount As Integer
iCompression As Long
iSizeImage As Long
iXPelsPerMeter As Long
iYPelsPerMeter As Long
iClrUsed As Long
iClrImportant As Long
End Type
Type lssHeader
magic As Long
iWidth As Integer
iHeight As Integer
colors(1 To 16) As RGBColor3
End Type
Function PadHex(myByte As Byte) As String
Dim tmpStr As String
tmpStr = Hex$(myByte)
If Len(tmpStr) < 2 Then tmpStr = "0" & tmpStr
PadHex = tmpStr
End Function
Sub convertBMPtoLSS()
Dim fileSystem
Dim myBmpHeader As bmpHeader
Dim myBmpPallete(256) As RGBColor4
Dim myBmpData() As Byte
Dim myLssHeader As lssHeader
Dim DebugStr As String
Dim filename As String
Dim iColor As Byte
Dim myByte As Byte
Dim nCount As Integer
Dim run As Integer
Dim erun As Byte
Dim current As Byte
Dim prev As Byte
Dim rowBuffer() As Byte
Dim dBitmapRow As String
Dim dBuffer As String
Dim dLSSRow As String
sourcefile = "I:\PXE Server\splash.bmp"
outputfile = "I:\PXE Server\splash.lss"
Set fileSystem = CreateObject("Scripting.FileSystemObject")
If fileSystem.FileExists(sourcefile) Then
Open sourcefile For Binary As #1
If fileSystem.FileExists(outputfile) Then fileSystem.DeleteFile (outputfile), True
Open outputfile For Binary As #2
Else
DebugStr = "Failure"
Exit Sub
End If
Get #1, , myBmpHeader
Get #1, , myBmpPallete
ReDim myBmpData(myBmpHeader.iWidth + 2, myBmpHeader.iHeight) As Byte
Get #1, , myBmpData
Close #1
With myBmpHeader
DebugStr = .iWidth & "x" & .iHeight & ", " & .iBitCount & "bit "
myLssHeader.magic = &H1413F33D
myLssHeader.iWidth = .iWidth
myLssHeader.iHeight = .iHeight
For I = 1 To 16 'Get the first 16 colors from the pallete
myLssHeader.colors(I).cRed = myBmpPallete(I).cRed \ 4
myLssHeader.colors(I).cGreen = myBmpPallete(I).cGreen \ 4
myLssHeader.colors(I).cBlue = myBmpPallete(I).cBlue \ 4
'Debug.Print I & " " & PadHex(myLssHeader.colors(I).cRed) & " " & PadHex(myLssHeader.colors(I).cGreen) & " " & PadHex(myLssHeader.colors(I).cBlue)
Next I
Put #2, , myLssHeader 'Write the header
Y = 1
For Y = .iHeight To 1 Step -1
nCount = 0
prev = 0
current = 0
run = 0
dBitmapRow = ""
dBuffer = ""
dLSSRow = ""
ReDim rowBuffer(0 To .iWidth)
For X = 1 To (.iWidth)
'dBitmapRow = dBitmapRow & Hex(myBmpData(X, Y)) '& " "
If myBmpData(X, Y) = current Then
run = run + 1
Else
If run > 0 Then GoSub EnqueRun
prev = current
current = myBmpData(X, Y)
run = 1
End If
Next X
GoSub EnqueRun
If nCount Mod 2 = 1 Then nCount = nCount + 1
'For I = 0 To (nCount - 1)
' dBuffer = dBuffer & Hex$(rowBuffer(I)) & " "
'Next I
For I = 0 To nCount Step 2
rowBuffer(I \ 2) = (rowBuffer(I + 1) * 16) Or rowBuffer(I)
'dLSSRow = dLSSRow & " " & PadHex(rowBuffer(I \ 2)) & " "
Next I
'If Y >= 5 And Y <= 7 Then
' Debug.Print "---"
' Debug.Print dBitmapRow
' Debug.Print dBuffer
' Debug.Print dLSSRow
'End If
ReDim Preserve rowBuffer(0 To ((nCount \ 2) - 1))
Put #2, , rowBuffer
Next Y
End With
Close #2 ' Close file.
Exit Sub
EnqueRun:
'If Y >= 5 And Y <= 7 Then
' Debug.Print "Color: " & Hex(current) & " Run: " & run & " " & Hex(run)
'End If
If prev <> current Then
rowBuffer(nCount) = current
nCount = nCount + 1
run = run - 1
End If
While run > 0
If run < 16 Then
rowBuffer(nCount) = current
rowBuffer(nCount + 1) = run
nCount = nCount + 2
run = 0
Else
rowBuffer(nCount) = current
rowBuffer(nCount + 1) = 0
If run > 271 Then
erun = 255
run = run - 271
Else
erun = run - 16
run = 0
End If
rowBuffer(nCount + 2) = (erun And &HF)
rowBuffer(nCount + 3) = (erun \ 16)
nCount = nCount + 4
End If
Wend
Return
End Sub
More information about the Syslinux
mailing list