March 01, 2021, 11:03:34 PM

Author Topic: [bb] alpha_engine v.6 by ascii [ 1+ years ago ]  (Read 412 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] alpha_engine v.6 by ascii [ 1+ years ago ]
« on: June 29, 2017, 12:28:41 AM »
Title : alpha_engine v.6
Author : ascii
Posted : 1+ years ago

Description : Usage:

to set up an image for alphablending:

image_handle = alpha_precalc_image(LoadImage("anyimage.any"))

which returns the image handle to use for rendering:

alpha_render_image(image_handle,scrx,scry,alpha#)

scrx and scry are screen coords. alpha# is float between 0 and 1.

no restrictions on usage of any kind.

Cheers,

Thomas


Code :
Code: BlitzBasic
  1. Function alpha_precalc_image(img)
  2.  
  3.         imgwidth        = ImageWidth(img) - 1
  4.         imgheight       = ImageHeight(img) - 1
  5.  
  6.         framesize = (imgwidth + 1) * (imgheight + 1) * 4                ; no of bytes pr. 'frame'
  7.  
  8.         bsize = (framesize * 101) + 8                                   ; banksize + little extra (until i bother debugging)
  9.                        
  10.         bank = CreateBank(bsize)
  11.                
  12.         PokeShort bank,0,imgwidth
  13.         PokeShort bank,2,imgheight
  14.        
  15.         pointer = 4    
  16.        
  17.         SetBuffer ImageBuffer(img)
  18.  
  19.         LockBuffer ImageBuffer(img)
  20.  
  21.         For z# = 0 To 1 Step 0.01
  22.  
  23.                 For y = 0 To (imgheight)
  24.        
  25.                         For x = 0 To (imgwidth)
  26.  
  27.                                 col             = (ReadPixelFast(x,y) And $FFFFFF)
  28.                                 r               = Int(((col And $FF0000) Shr 16) * z#)
  29.                                 g               = Int(((col And $FF00) Shr 8) * z#)
  30.                                 b               = Int((col And $FF) * z#)
  31.  
  32.                                 lum             = r
  33.                                
  34.                                 If g > lum
  35.                                
  36.                                         lum = g
  37.                                        
  38.                                 ElseIf b > lum
  39.                                
  40.                                         lum = b
  41.                                        
  42.                                 EndIf
  43.  
  44.                                 PokeByte bank,pointer,r
  45.                                 PokeByte bank,pointer + 1,g
  46.                                 PokeByte bank,pointer + 2,b
  47.                                 PokeByte bank,pointer + 3,lum
  48.  
  49.                                 pointer = pointer + 4
  50.        
  51.                         Next
  52.        
  53.                 Next
  54.  
  55.         Next
  56.  
  57.         UnlockBuffer ImageBuffer(img)
  58.  
  59.         FreeImage(img)
  60.  
  61.         SetBuffer BackBuffer()
  62.  
  63.         Return bank
  64.  
  65. End Function
  66.  
  67. Function alpha_render_image(bank,scrx,scry,alpha#)
  68.  
  69.         imgwidth        = PeekShort(bank,0)
  70.         imgheight       = PeekShort(bank,2)
  71.  
  72.         scrx = scrx - (imgwidth / 2)
  73.         scry = scry - (imgheight / 2)
  74.  
  75.         framesize       = (imgwidth + 1) * (imgheight + 1) * 4
  76.  
  77.         frameno = Int(alpha# * 100)
  78.  
  79.         pointer = (framesize * frameno) + 4
  80.  
  81.         destalpha# = 1 - alpha#
  82.  
  83.         If alpha# > 1 Then alpha# = 1
  84.         If alpha# < 0 Then alpha# = 0
  85.  
  86.         LockBuffer BackBuffer()
  87.  
  88.         For y = 0 To (imgheight)
  89.  
  90.                 For x = 0 To (imgwidth)
  91.  
  92.                         sx = scrx + x
  93.                         sy = scry + y
  94.                        
  95.                         If sx > 0 And sx < (scrw - 1) And sy > 0 And sy < (scrh - 1)
  96.  
  97.                                 dcol = (ReadPixelFast(sx,sy) And $FFFFFF)
  98.  
  99.                                 If dcol < $FFFFFF
  100.  
  101.                                         lum     = PeekByte(bank,pointer + 3)
  102.                
  103.                                         fr      = ((dcol And $FF0000) Shr 16) + PeekByte(bank,pointer)
  104.                                         fg      = ((dcol And $FF00) Shr 8) + PeekByte(bank,pointer + 1)
  105.                                         fb      = (dcol And $FF) + PeekByte(bank,pointer + 2)
  106.                                        
  107.                                         If fr > 255 Then fr = 255
  108.                                         If fg > 255 Then fg = 255
  109.                                         If fb > 255 Then fb = 255
  110.        
  111.                                         dlum = fr
  112.                                        
  113.                                         If fg > dlum
  114.                                        
  115.                                                 dlum = fg
  116.                                                
  117.                                         ElseIf fb > dlum
  118.                                        
  119.                                                 dlum = fb
  120.                                                
  121.                                         EndIf
  122.        
  123.                                         If dlum >= lum
  124.        
  125.                                                 WritePixelFast sx,sy,(fr Shl 16) Or (fg Shl 8) Or fb
  126.        
  127.                                         EndIf
  128.  
  129.                                 EndIf
  130.  
  131.                         EndIf
  132.  
  133.                         pointer = pointer + 4
  134.                
  135.                 Next
  136.  
  137.         Next
  138.  
  139.         UnlockBuffer BackBuffer()
  140.  
  141. End Function


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal