
Code: Select all
EnableExplicit
;BCD-7 Example by Mijikai :D
;PB 6.0 LTS x64
UsePNGImageEncoder()
UsePNGImageDecoder()
Procedure.i bcd7Font();<- create bcd-7 texture charset
Protected img.i,index.i,px.i,py.i
Protected *draw.CLSID,*link.CLSID
img = CreateImage(#PB_Any,16 << 3,8,32,#PB_Image_Transparent)
If img
If StartDrawing(ImageOutput(img))
DrawingMode(#PB_2DDrawing_AllChannels)
*draw = ?bcd7_matrix + 20
*link = ?bcd7_matrix - 8
For index = 0 To 15
px = index << 3
For py = 0 To 6
LineXY(px + *link\Data4[0],*link\Data4[1],px + *link\Data4[2],*link\Data4[3],*draw\Data4[py] * $FFFFFFFF)
*link + 4
Next
*link - 28
*draw + 7
Next
StopDrawing()
*draw = EncodeImage(img,#PB_ImagePlugin_PNG,#Null,32)
FreeImage(img)
ProcedureReturn *draw
EndIf
FreeImage(img)
EndIf
ProcedureReturn #Null
bcd7_matrix:
!db 2,0,6,0,1,1,1,2,7,1,7,2,2,3,6,3,1,4,1,5,7,4,7,5,2,6,6,6
!db 1,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,1,1,0,1,1,0,1,1;<- lazy (should be bits)!
!db 0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,1,1,1,1,0,1,0,0,1,0
!db 1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,1,0,1,1,1,1
!db 0,0,0,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,1,0,1,1,1,0,1,1,0,0
EndProcedure
Procedure.i bcd7DrawText(Sprite.i,X.i,Y.i,Size.i,Text.s);<- map text to the bcd-7 sprite charset
Protected *chr.Unicode,*Map.Unicode
Protected index.i
*chr = @Text
While *chr\u
*map = ?bcd7_decode
For index = 0 To 15;<- lazy (slow way)!
If *chr\u = *map\u
ClipSprite(Sprite,index << 3,0,8,8)
ZoomSprite(Sprite,Size,Size)
DisplayTransparentSprite(Sprite,X,Y,255,#Red +index << 7)
Break
EndIf
*map + 2
Next
X + Size
*chr + 2
Wend
ClipSprite(Sprite,0,0,128,8)
ProcedureReturn #Null
bcd7_decode:
!du '0123456789abcdef'
EndProcedure
Procedure.i Main()
Protected exit.i,sprite.i
Protected *font
*font = bcd7Font()
If *font
If InitSprite()
If OpenWindow(0,#Null,#Null,600,400,"BCD-7 Demo by Mijikai",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If OpenWindowedScreen(WindowID(0),#Null,#Null,600,400)
SetFrameRate(60)
sprite = CatchSprite(#PB_Any,*font,#PB_Sprite_AlphaBlending)
If sprite
Repeat
Repeat
Select WindowEvent()
Case #PB_Event_CloseWindow
exit = #True
Case #Null
Break
EndSelect
ForEver
ClearScreen($0)
ZoomSprite(sprite,580,50)
RotateSprite(sprite,30,#PB_Absolute)
DisplayTransparentSprite(sprite,0,180,30,#Red)
RotateSprite(sprite,0,#PB_Absolute)
bcd7DrawText(sprite,45,180,32,"abcdef0123456789")
FlipBuffers()
Until exit
FreeSprite(sprite)
EndIf
CloseScreen()
EndIf
CloseWindow(0)
EndIf
EndIf
FreeMemory(*font)
EndIf
ProcedureReturn #Null
EndProcedure
Main()
End