March 05, 2021, 07:16:47 AM

Author Topic: [bmx] Pub.PCXLoader by gman [ 1+ years ago ]  (Read 699 times)

Offline BlitzBot

[bmx] Pub.PCXLoader by gman [ 1+ years ago ]
« on: June 29, 2017, 12:28:39 AM »
Title : Pub.PCXLoader
Author : gman
Posted : 1+ years ago

Description : Pretty basic as it only loads 8bit 256 color images with a palette.  full mod download at:

<a href="http://www.gprogs.com/pub.pcxloader/2006_01_14_pcxloader.zip" target="_blank">2006_01_14 PCXLoader Mod[/url]

<a href="http://www.gprogs.com/pub.pcxloader/pcxsample.zip" target="_blank">PCXLoader Sample[/url]

extract contained files to mod/pub.mod/pcxloader.mod

this works like all other pixmap loaders.  just import the lib and call LoadPixmap.


Code :
Code: BlitzMax
  1. Strict
  2.  
  3. Rem
  4. bbdoc: PCX loader.  Only supports 8bit 256 color palette PCX images.
  5. End Rem
  6. Module Pub.PCXLoader
  7.  
  8. ModuleInfo "Version: 1.00"
  9. ModuleInfo "Author: gman"
  10. ModuleInfo "License: freebie"
  11.  
  12. Import BRL.Pixmap
  13. Import BRL.Bank
  14.  
  15. Type TPixmapLoaderPCX Extends TPixmapLoader
  16.  
  17.         Method LoadPixmap:TPixmap( file:TStream )
  18.                 Local retval:TPixmap=Null
  19.                
  20.                 Local PCXData:Byte[]
  21.                 Local PaletteData:Int[]
  22.  
  23.                 Local header:SPCXHeader=New SPCXHeader
  24.                 header.fillFromReader(file,SPCXHeader.size,0,0)
  25.  
  26.                 ' Return If the header is wrong
  27.                 If (header.Manufacturer <> $0a And header.Encoding <> $01) Then Return Null
  28.  
  29.                 ' Return If this isn't a supported type
  30.                 If ((header.BitsPerPixel < 8) Or (header.BitsPerPixel > 24))
  31.                         DebugLog("Unsupported bits per pixel in PCX file ("+header.BitsPerPixel+").")
  32.                         Return Null
  33.                 EndIf
  34.  
  35.                 Local pos:Int = StreamPos(file)
  36.                 Local palIndicator:Byte
  37.                                
  38.                 ' check the PAL indicator
  39.                 SeekStream(file,StreamSize(file)-769)
  40.  
  41.                 palIndicator=ReadByte(file)
  42.  
  43.                 If ( palIndicator <> 12 )
  44.                         DebugLog("Unsupported pal indicator in PCX file ("+palIndicator+").")
  45.                         Return Null
  46.                 EndIf
  47.                                        
  48.                 ' read palette
  49.                 PaletteData = PaletteData[..256]
  50.                 Local tempPalette:Byte Ptr=ReadString(file,768).ToCString()
  51.                
  52.                 ' convert the red,green,blue of the palette into colors                        
  53.                 For Local i:Int=0 To 255
  54.                         PaletteData[i]=($ff000000 | ..
  55.                                 tempPalette[i*3+0] Shl 16 | ..
  56.                                 tempPalette[i*3+1] Shl 8 | ..
  57.                                 tempPalette[i*3+2])                                                            
  58.                 Next
  59.                 tempPalette=Null
  60.  
  61.                 SeekStream(file,pos)
  62.  
  63.                 Local width:Int, height:Int
  64.                 width = header.XMax - header.XMin + 1
  65.                 height = header.YMax - header.YMin + 1
  66.                                
  67.                 ' read in the image data
  68.                 Local offset:Long,imagebytes:Long
  69.                 Local cnt:Int,char:Byte
  70.                                
  71.                 imagebytes = header.BytesPerLine * header.Planes * (1 + header.Ymax - header.Ymin)
  72.                 PCXData=PCXData[..imagebytes]
  73.                 Local bufr:Byte Ptr=Varptr(PCXData[0])
  74.        
  75.                 Local written:Int              
  76.                 For offset = 0 To imagebytes-1    ' /* increment by cnt below */
  77.  
  78.                         ' read in the next char and see if we have read past the end of file
  79.                 If Not encget(char,cnt,file) Then Exit
  80.  
  81.                         ' store the data, repeat the char cnt times if needed
  82.                For Local i:Int = 0 To cnt-1
  83.                                 bufr[0]=char
  84.                 bufr:+1
  85.                         Next
  86.  
  87.                         written:+ cnt
  88.  
  89.                         ' check to see if we have written enough
  90.                         If written>=imagebytes Then Exit
  91.                 Next
  92.  
  93.                 ' create the pixmap                                                                    
  94.                 Local tmpptr:Byte Ptr=Varptr(PCXData[0])
  95.                 retval=CreatePixmap(width,height,PF_RGB888)                            
  96.                
  97.                 For Local y:Int=0 To height-1                          
  98.                         For Local x:Int=0 To width-1
  99.                                 WritePixel(retval,x,y,PaletteData[tmpptr[0]])
  100.                                 tmpptr:+1
  101.                         Next
  102.                 Next                           
  103.                
  104.                 header=Null
  105.                 bufr=Null
  106.                 tmpptr=Null
  107.                 PaletteData=Null
  108.                 PCXData=Null
  109.  
  110.                 Return retval
  111.         End Method
  112. End Type
  113.  
  114. New TPixmapLoaderPCX
  115.  
  116. Private
  117.  
  118. Rem
  119. /* This procedure reads one encoded block from the image file And stores a
  120. count And data byte.
  121.  
  122. Return result:  1 = valid data stored, Null = out of data in file */
  123. EndRem
  124. Function encget:Int(pbyt:Byte Var,pcnt:Int Var,fid:TStream)
  125.         Local i:Byte
  126.      pcnt = 1        '/* assume a "run" length of one */
  127.  
  128.         If Eof(fid) Then Return Null Else i=ReadByte(fid)
  129.  
  130.         If ($C0 = ($C0 & i))
  131.                 pcnt = $3F & i
  132.                 If Eof(fid) Then Return Null Else i=ReadByte(fid)
  133.         EndIf
  134.  
  135.         pbyt = i
  136.      Return 1
  137. EndFunction
  138.  
  139. Type SPCXHeader Extends PACK_STRUCT
  140.         Global size:Int=128
  141.  
  142.         Field Manufacturer:Byte
  143.         Field Version:Byte
  144.         Field Encoding:Byte
  145.         Field BitsPerPixel:Byte
  146.         Field XMin:Short
  147.         Field YMin:Short
  148.         Field XMax:Short
  149.         Field YMax:Short
  150.         Field HorizDPI:Short
  151.         Field VertDPI:Short
  152.         Field Palette:Byte[48]
  153.         Field Reserved:Byte
  154.         Field Planes:Byte
  155.         Field BytesPerLine:Short
  156.         Field PaletteType:Short
  157.         Field HScrSize:Short
  158.         Field VScrSize:Short
  159.         Field Filler:Byte[54]
  160.  
  161.         Method fillFromBank(bank:TBank,start:Int=0)
  162.                 Local i:Int
  163.                
  164.                 Manufacturer=PeekByte(bank,start)
  165.                 Version=PeekByte(bank,start+1)
  166.                 Encoding=PeekByte(bank,start+2)
  167.                 BitsPerPixel=PeekByte(bank,start+3)
  168.                 XMin=PeekShort(bank,start+4)
  169.                 YMin=PeekShort(bank,start+6)
  170.                 XMax=PeekShort(bank,start+8)
  171.                 YMax=PeekShort(bank,start+10)
  172.                 HorizDPI=PeekShort(bank,start+12)
  173.                 VertDPI=PeekShort(bank,start+14)
  174.                
  175.                 For i=0 To 47
  176.                         Palette[i]=PeekByte(bank,start+16+i)
  177.                 Next
  178.                
  179.                 Reserved=PeekByte(bank,start+64)
  180.                 Planes=PeekByte(bank,start+65)
  181.                 BytesPerLine=PeekShort(bank,start+66)
  182.                 PaletteType=PeekShort(bank,start+68)
  183.                 HScrSize=PeekShort(bank,start+70)
  184.                 VScrSize=PeekShort(bank,start+72)
  185.                 For i=0 To 53
  186.                         Filler[i]=PeekByte(bank,start+74+i)
  187.                 Next           
  188.         EndMethod
  189.        
  190. EndType
  191.  
  192. ' generic type for reading in PACK_STRUCT structures from files
  193. Type PACK_STRUCT
  194.         Global size:Int=0
  195.                        
  196.         Method fillFromBank(bank:TBank,start:Int)
  197.         EndMethod
  198.  
  199.         ' returns true if successful
  200.         Method fillFromReader:Int(fileToRead:TStream,tbsize:Int,readeroffset:Int=0,bankoffset:Int=0)
  201.                 If Not fileToRead Then Return False
  202.                
  203.                 ' create the bank
  204.                 Local structbank:TBank=CreateBank(tbsize)
  205.                
  206.                 ' read from the file
  207.                 structbank.Read(fileToRead,readeroffset,tbsize)
  208.                
  209.                 ' populate the STRUCT with what was read
  210.                 fillFromBank(structbank,bankoffset)
  211.                
  212.                 ' clear out the bank
  213.                 structbank=Null
  214.                
  215.                 Return True
  216.         EndMethod
  217.        
  218.         Method getBank:TBank()
  219.                 Return Null
  220.         EndMethod      
  221. EndType


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal