January 15, 2021, 06:23:16 PM

Author Topic: [bb] Fast color replace function (b+ only) by skn3 [ 1+ years ago ]  (Read 394 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Fast color replace function (b+ only)
Author : skn3
Posted : 1+ years ago

Description : This function uses the b+ fast pixel routines, to replace all instances of old color (r,g,b) with new color (r,g,b)

Code :
Code: BlitzBasic
  1. ;
  2. ; ************************************************************
  3. ; * Project Name : Fast Replace color
  4. ; * Author(s)    : Jonathan Pittock
  5. ; * Website      : www.acsv.net
  6. ; ************************************************************
  7.  
  8. ;#Region Help
  9.         ;ReplaceColor(buffer,width,height,old_r,old_g,old_b,new_r,new_g,new_b)
  10.        
  11.         ;Replaces all instances of old color, with new color, in a valid buffer.
  12.        
  13.         ;Parameters
  14.         ;buffer - A valid blitz graphic buffer
  15.         ;width  - width of graphics buffer
  16.         ;height - height of graphics buffer
  17.         ;old_r  - red color component to be replaced
  18.         ;old_g  - green color component to be replaced
  19.         ;old_b  - blue color component to be replaced
  20.         ;new_r  - red color component that will replace old red component
  21.         ;new_r  - green color component that will replace old green component
  22.         ;new_r  - blue color component that will replace old blue component
  23. ;#End Region
  24.  
  25. ;#Region Example code
  26.         Graphics 640,400,32,2
  27.         image = CreateImage(50,50,1,2)
  28.         SetBuffer ImageBuffer(image)
  29.         Color 255,0,0
  30.         Rect 0,0,50,50,1
  31.         SetBuffer BackBuffer()
  32.         Cls
  33.         DrawImage image,50,50
  34.         Color 255,255,255
  35.         Text 5,5,"press any key to replace colors in image"
  36.         Flip
  37.         WaitKey()
  38.         starttime = MilliSecs()
  39.         ReplaceColor(ImageBuffer(image),ImageWidth(image),ImageHeight(image), 255,0,0, 0,255,0)
  40.         endtime = MilliSecs()
  41.         Cls
  42.         DrawImage image,50,50
  43.         Color 255,255,255
  44.         Text 5,5,"Done!, press any key to perform a stress test"
  45.         Text 5,25,"Replace color took "+(endtime-starttime)+" ms"
  46.         Flip
  47.         WaitKey()
  48.         starttime = MilliSecs()
  49.         lastr = 0
  50.         lastg = 255
  51.         lastb = 0
  52.        
  53.         buffer       = ImageBuffer(image)
  54.         bufferwidth  = ImageWidth(image)
  55.         bufferheight = ImageHeight(image)
  56.        
  57.         For i=0 To 100
  58.                 r = Rand(0,255)
  59.                 g = Rand(0,255)
  60.                 b = Rand(0,255)
  61.                 ReplaceColor(buffer,bufferwidth,bufferheight, lastr,lastg,lastb, r,g,b)
  62.                 lastr = r
  63.                 lastg = g
  64.                 lastb = b
  65.         Next
  66.         endtime = MilliSecs()
  67.         Cls
  68.         DrawImage image,50,50
  69.         Color 255,255,255
  70.         Text 5,5,"Done!, press any key to end"
  71.         Text 5,25,"Stress test of 100 ReplaceColor function calls took "+(endtime-starttime)+" ms"
  72.         Flip
  73.         WaitKey()
  74.         FreeImage image
  75.        
  76.         End
  77. ;#End Region
  78.  
  79. ;#Region ReplaceColor code
  80. Function ReplaceColor(buffer,bufferwidth,bufferheight,oldr,oldg,oldb,newr,newg,newb)
  81.         oldbuffer = GraphicsBuffer()
  82.         SetBuffer buffer
  83.         LockBuffer buffer
  84.         bufferbank   = LockedPixels()
  85.         bufferpitch  = LockedPitch()
  86.         bufferformat = LockedFormat()
  87.        
  88.         Select bufferformat
  89.                 Case 1
  90.                         newrgb = (newr/8 Shl 11) Or (newg/4 Shl 5) Or (newb Shr 3)
  91.                         For y = 0 To bufferheight-1
  92.                                 rowoffset  = y * bufferpitch
  93.                                 For x = 0 To bufferwidth-1
  94.                                         offset = rowoffset + (x Shl 1)
  95.                                         rgb    = PeekShort(bufferbank,offset)
  96.                                         r      = ((rgb And $F800) Shr 11) Shl 3
  97.                                         g      = ((rgb And $7E0) Shr 5) Shl 2
  98.                                         b      = (rgb And $1F) Shl 3
  99.                                        
  100.                                         If r = oldr And g = oldg And b = oldb
  101.                                                 ;replace color
  102.                                                 rgb = newrgb
  103.                                                 ;insert back into bank
  104.                                                 PokeShort bufferbank,offset,rgb
  105.                                                 PokeShort bufferbank,offset+2,rgb
  106.                                         End If
  107.                                 Next
  108.                         Next
  109.                 Case 2
  110.                         newrgb = (newr/8 Shl 10) Or (newg/8 Shl 5) Or (newb Shr 3)
  111.                         For y = 0 To bufferheight-1
  112.                                 rowoffset  = y * bufferpitch
  113.                                 For x = 0 To bufferwidth-1
  114.                                         offset = rowoffset + (x Shl 1)
  115.                                         rgb    = PeekShort(bufferbank,offset)
  116.                                         r      = ((rgb And $7C00) Shr 10) Shl 3
  117.                                         g      = ((rgb And $3E0) Shr 5) Shl 3
  118.                                         b      = (rgb And $1F) Shl 3
  119.                                        
  120.                                         If r = oldr And g = oldg And b = oldb
  121.                                                 ;replace color
  122.                                                 rgb = newrgb
  123.                                                 ;insert back into bank
  124.                                                 PokeShort bufferbank,offset,rgb
  125.                                                 PokeShort bufferbank,offset+2,rgb
  126.                                         End If
  127.                                 Next
  128.                         Next
  129.                 Case 3
  130.                         newrgb = newb Or (newg Shl 8) Or (newr Shl 16)
  131.                         For y = 0 To bufferheight-1
  132.                                 rowoffset  = y * bufferpitch
  133.                                 For x = 0 To bufferwidth-1
  134.                                         offset = rowoffset + (x * 3)
  135.                                         rgb    = PeekInt(bufferbank,offset)
  136.                                         r      = (rgb And $FF0000) Shr 16
  137.                                         g      = (rgb And $FF00) Shr 8
  138.                                         b      = rgb And $FF
  139.                                        
  140.                                         If r = oldr And g = oldg And b = oldb
  141.                                                 ;replace color
  142.                                                 rgb = newrgb
  143.                                                 ;insert back into bank
  144.                                                 PokeInt bufferbank,offset,rgb
  145.                                         End If
  146.                                 Next
  147.                         Next
  148.                 Case 4
  149.                         newrgb = newb Or (newg Shl 8) Or (newr Shl 16)
  150.                         For y = 0 To bufferheight-1
  151.                                 rowoffset  = y * bufferpitch
  152.                                 For x = 0 To bufferwidth-1
  153.                                         offset = rowoffset + (x Shl 2)
  154.                                         rgb    = PeekInt(bufferbank,offset)
  155.                                         r      = (rgb And $FF0000) Shr 16
  156.                                         g      = (rgb And $FF00) Shr 8
  157.                                         b      = rgb And $FF
  158.                                        
  159.                                         If r = oldr And g = oldg And b = oldb
  160.                                                 ;replace color
  161.                                                 rgb = newrgb
  162.                                                 ;insert back into bank
  163.                                                 PokeInt bufferbank,offset,rgb
  164.                                         End If
  165.                                 Next
  166.                         Next
  167.         End Select
  168.         UnlockBuffer buffer
  169.         SetBuffer oldbuffer
  170. End Function
  171. ;#End Region


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal