Ooops
March 02, 2021, 02:24:01 PM

Author Topic: [bb] B+ fast pixel functions made easy! by skn3 [ 1+ years ago ]  (Read 450 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : B+ fast pixel functions made easy!
Author : skn3
Posted : 1+ years ago

Description : Makes fast pixel writting in b+ easier than A..B..C!

Update:
Added feature to speed up fast writting (by at least 30fps). Is explained in examples section of code.


Code :
Code: BlitzBasic
  1. ; ID: 1082
  2. ; Author: skn3[ac]
  3. ; Date: 2004-06-11 14:35:37
  4. ; Title: B+ fast pixel functions made easy!
  5. ; Description: Use the b+ fast pixel drawing operations easily. Uses sensibly structured commands to wrap the b+ LockedPixels(), LockedFormat() and LockedPitch() functions
  6.  
  7. ; ------------------------------------------------------------------------------------------------------------
  8. ;functions and runtime values
  9. Global fastbank=0,fastformat=0,fastpitch=0,fastbuffer=0
  10.  
  11. Function FastLockBuffer(buffer)
  12.         LockBuffer(buffer)
  13.         fastbank   = LockedPixels()
  14.         fastformat = LockedFormat()
  15.         fastpitch  = LockedPitch()
  16.         fastbuffer = buffer
  17. End Function
  18.  
  19. Function FastUnlockBuffer()
  20.         UnlockBuffer(fastbuffer)
  21.         fastbank   = 0
  22.         fastformat = 0
  23.         fastpitch  = 0
  24.         fastbuffer = 0
  25. End Function
  26.  
  27. Function FastWritePixel(x,y,rgb)
  28.         Select fastformat
  29.                 Case 1 : PokeInt(fastbank,(y * fastpitch) + (x Shl 1),(rgb Shl 24) + rgb)
  30.                 Case 2 : PokeInt(fastbank,(y * fastpitch) + (x Shl 1),(rgb Shl 24) + rgb)
  31.                 Case 3 : PokeInt(fastbank,(y * fastpitch) + (x * 3),rgb)
  32.                 Case 4 : PokeInt(fastbank,(y * fastpitch) + (x Shl 2),rgb)
  33.         End Select
  34. End Function
  35.  
  36. Function FastWritePixelFormat1(x,y,rgb)
  37.         PokeInt(fastbank,(y * fastpitch) + (x Shl 1),(rgb Shl 24) + rgb)
  38. End Function
  39.  
  40. Function FastWritePixelFormat2(x,y,rgb)
  41.         PokeInt(fastbank,(y * fastpitch) + (x Shl 1),(rgb Shl 24) + rgb)
  42. End Function
  43.  
  44. Function FastWritePixelFormat3(x,y,rgb)
  45.         PokeInt(fastbank,(y * fastpitch) + (x * 3),rgb)
  46. End Function
  47.  
  48. Function FastWritePixelFormat4(x,y,rgb)
  49.         PokeInt(fastbank,(y * fastpitch) + (x Shl 2),rgb)
  50. End Function
  51.  
  52. Function FastReadPixel(x,y)
  53.         Select fastformat
  54.                 Case 1 : Return PeekShort(fastbank,(y * fastpitch) + (x Shl 1))
  55.                 Case 2 : Return PeekShort(fastbank,(y * fastpitch) + (x Shl 1))
  56.                 Case 3 : Return PeekInt(fastbank,(y * fastpitch) + (x * 3))
  57.                 Case 4 : Return PeekInt(fastbank,(y * fastpitch) + (x Shl 2))
  58.         End Select
  59. End Function
  60.  
  61. Function FastReadPixelFormat1(x,y)
  62.         Return PeekShort(fastbank,(y * fastpitch) + (x Shl 1))
  63. End Function
  64.  
  65. Function FastReadPixelFormat2(x,y)
  66.         Return PeekShort(fastbank,(y * fastpitch) + (x Shl 1))
  67. End Function
  68.  
  69. Function FastReadPixelFormat3(x,y)
  70.         Return PeekInt(fastbank,(y * fastpitch) + (x * 3))
  71. End Function
  72.  
  73. Function FastReadPixelFormat4(x,y)
  74.         Return PeekInt(fastbank,(y * fastpitch) + (x Shl 2))
  75. End Function
  76.  
  77. Function FastGetRgb(r,g,b)
  78.         Select fastformat
  79.                 Case 1 : Return (r/8 Shl 11) Or (g/4 Shl 5) Or (b Shr 3)
  80.                 Case 2 : Return (r/8 Shl 10) Or (g/8 Shl 5) Or (b Shr 3)
  81.                 Case 3 : Return b Or (g Shl 8) Or (r Shl 16)
  82.                 Case 4 : Return b Or (g Shl 8) Or (r Shl 16)
  83.         End Select
  84. End Function
  85.  
  86. Function FastGetR(rgb)
  87.         Select fastformat
  88.                 Case 1 : Return ((rgb And $F800) Shr 11) Shl 3
  89.                 Case 2 : Return ((rgb And $7C00) Shr 10) Shl 3
  90.                 Case 3 : Return (rgb And $FF0000) Shr 16
  91.                 Case 4 : Return (rgb And $FF0000) Shr 16
  92.         End Select
  93. End Function
  94.  
  95. Function FastGetG(rgb)
  96.         Select fastformat
  97.                 Case 1 : Return ((rgb And $7E0) Shr 5) Shl 2
  98.                 Case 2 : Return ((rgb And $3E0) Shr 5) Shl 3
  99.                 Case 3 : Return (rgb And $FF00) Shr 8
  100.                 Case 4 : Return (rgb And $FF00) Shr 8
  101.         End Select
  102. End Function
  103.  
  104. Function FastGetB(rgb)
  105.         Select fastformat
  106.                 Case 1 : Return (rgb And $1F) Shl 3
  107.                 Case 2 : Return (rgb And $1F) Shl 3
  108.                 Case 3 : Return rgb And $FF
  109.                 Case 4 : Return rgb And $FF
  110.         End Select
  111. End Function
  112.  
  113. ; ------------------------------------------------------------------------------------------------------------
  114. ;examples
  115. ; - how to read a correct r,g,b from a pixel
  116. ;
  117. ;       FastLockBuffer(Backbuffer())
  118. ;               rgb = FastReadPixel(x,y)
  119. ;               r   = FastGetR(rgb)
  120. ;               g   = FastGetG(rgb)
  121. ;               b   = FastGetB(rgb)
  122. ;       FastUnlockBuffer()
  123.  
  124.  
  125. ; - how to write a correct r,g,b to a pixel
  126. ;
  127. ;       FastLockBuffer(backbuffer())
  128. ;               rgb = FastGetRgb(r,g,b)
  129. ;               FastWritePixel(x,y,rgb)
  130. ;       FastUnlockBuffer()
  131.  
  132.  
  133. ; - how to write multiple pixels at once
  134. ;       The system checks what format the graphics buffer is in each time you read/write a pixel.
  135. ;       if you use the following functions you can bypass the checks.
  136. ;
  137. ;       FastWritePixelFormat1(x,y,rgb)
  138. ;       FastWritePixelFormat2(x,y,rgb)
  139. ;       FastWritePixelFormat3(x,y,rgb)
  140. ;       FastWritePixelFormat4(x,y,rgb)
  141. ;
  142. ;       you would have to test the value fastformat, which ranges from 1-4. The benifit of doing this
  143. ;       only becomes apparent when you want to perform lots of graphics operations at once.
  144. ;
  145. ;       FastLockBuffer(backbuffer())
  146. ;               rgb = FastGetRgb(r,g,b)
  147. ;               select fastformat
  148. ;                       case 1
  149. ;                               for x=0 to 640
  150. ;                                       FastWritePixelFormat1(x,y,rgb)
  151. ;                               next
  152. ;                       case 2
  153. ;                               for x=0 to 640
  154. ;                                       FastWritePixelFormat2(x,y,rgb)
  155. ;                               next
  156. ;                       case 3
  157. ;                               for x=0 to 640
  158. ;                                       FastWritePixelFormat3(x,y,rgb)
  159. ;                               next
  160. ;                       case 4
  161. ;                               for x=0 to 640
  162. ;                                       FastWritePixelFormat4(x,y,rgb)
  163. ;                               next
  164. ;               end select
  165. ;       FastUnlockBuffer()
  166.  
  167. ; ------------------------------------------------------------------------------------------------------------
  168. ;demo
  169. Graphics 640,480,32,2 ;<-- try changing to fullscreen if you are using a slow pc
  170. SetBuffer(BackBuffer())
  171.  
  172. Global fpsdisplay = 0
  173. Global fpslast    = MilliSecs()
  174. Global fpscount   = 0
  175.  
  176. Global colorcycle = 0
  177. Global colormode  = True
  178.  
  179. Global drawmode   = 1
  180.  
  181. Repeat
  182.         Select drawmode
  183.                 Case 1
  184.                         rgb = (colorcycle Shl 16)+(g Shl 8)+b
  185.                         For y = 0 To 479
  186.                                 For x = 0 To 639
  187.                                         WritePixel(x,y,rgb)
  188.                                 Next
  189.                         Next
  190.                         Color 255,255,255
  191.                         Text 5,5,"drawmode: Blitz WritePixel" + " (press space to toggle)"
  192.                         Text 5,20,"fps: " + fpsdisplay
  193.                         If KeyHit(57) drawmode = 2
  194.                 Case 2
  195.                         LockBuffer(BackBuffer())
  196.                                 rgb = (colorcycle Shl 16)+(g Shl 8)+b
  197.                                 For y = 0 To 479
  198.                                         For x = 0 To 639
  199.                                                 WritePixelFast(x,y,rgb)
  200.                                         Next
  201.                                 Next
  202.                         UnlockBuffer(BackBuffer())
  203.                         Color 255,255,255
  204.                         Text 5,5,"drawmode: Blitz WritePixelFast" + " (press space to toggle)"
  205.                         Text 5,20,"fps: " + fpsdisplay
  206.                         If KeyHit(57) drawmode = 3
  207.                 Case 3
  208.                         FastLockBuffer(BackBuffer())
  209.                                 rgb = FastGetRgb(colorcycle,0,0)
  210.                                 For y = 0 To 479
  211.                                         For x = 0 To 639
  212.                                                 FastWritePixel(x,y,rgb)
  213.                                         Next
  214.                                 Next
  215.                         FastUnlockBuffer()
  216.                         Color 255,255,255
  217.                         Text 5,5,"drawmode: FastWrite (no format speed up)" + " (press space to toggle)"
  218.                         Text 5,20,"fps: " + fpsdisplay
  219.                         If KeyHit(57) drawmode = 4
  220.                 Case 4
  221.                         FastLockBuffer(BackBuffer())
  222.                                 rgb = FastGetRgb(colorcycle,0,0)
  223.                                 Select fastformat
  224.                                         Case 1
  225.                                                 For y = 0 To 479
  226.                                                         For x = 0 To 639
  227.                                                                 FastWritePixelFormat1(x,y,rgb)
  228.                                                         Next
  229.                                                 Next
  230.                                         Case 2
  231.                                                 For y = 0 To 479
  232.                                                         For x = 0 To 639
  233.                                                                 FastWritePixelFormat2(x,y,rgb)
  234.                                                         Next
  235.                                                 Next
  236.                                         Case 3
  237.                                                 For y = 0 To 479
  238.                                                         For x = 0 To 639
  239.                                                                 FastWritePixelFormat3(x,y,rgb)
  240.                                                         Next
  241.                                                 Next
  242.                                         Case 4
  243.                                                 For y = 0 To 479
  244.                                                         For x = 0 To 639
  245.                                                                 FastWritePixelFormat4(x,y,rgb)
  246.                                                         Next
  247.                                                 Next
  248.                                 End Select
  249.                         FastUnlockBuffer()
  250.                         Color 255,255,255
  251.                         Text 5,5,"drawmode: FastWrite (format speed up)" + " (press space to toggle)"
  252.                         Text 5,20,"fps: " + fpsdisplay
  253.                         If KeyHit(57) drawmode = 1
  254.         End Select
  255.         Flip False
  256.        
  257.         ;update fps
  258.         fpscount = fpscount + 1
  259.         If MilliSecs() > fpslast+1000
  260.                 fpsdisplay = fpscount
  261.                 fpscount   = 0
  262.                 fpslast    = MilliSecs()
  263.         End If
  264.        
  265.         ;update color cycle
  266.         If colormode = False
  267.                 colorcycle = colorcycle - 1
  268.                 If colorcycle = 0 colormode = True
  269.         Else
  270.                 colorcycle = colorcycle + 1
  271.                 If colorcycle = 255 colormode = False
  272.         End If
  273. Until KeyDown(1)


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal