DisplayRGBFilter() Replacement advice

Just starting out? Need help? Post your questions and find answers here.
hippy
User
User
Posts: 28
Joined: Tue Mar 05, 2013 3:11 pm

DisplayRGBFilter() Replacement advice

Post by hippy »

Hi All,

So i'm migrating a project from PB 4.60 to PB 5.40 LTS and i've found that DisplayRGBFilter() has been removed.
I read in the history...

Code: Select all

Removed: DisplayRGBFilter() -> can be replaced with a zoomed sprite with color
I'm not really sure what this means, it there a way to replicate the same effect that's easy?

Cheers,
Hip
infratec
Always Here
Always Here
Posts: 7582
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: DisplayRGBFilter() Replacement advice

Post by infratec »

Hi,

I'm not a graphic guy, but maybe you can use my quick try as replacement:

Code: Select all

Procedure DisplayRGBFilter(x.i, y.i, Width.i, Height.i, R.i, G.i, B.i)
  
  Static RGBSprite.i = -1
  Static OldWidth.i, OldHeight.i, OldColor.i = -1
  
  Protected Color.i
  
  
  Color = RGB(R, G, B)
    
  If Not IsSprite(RGBSprite)
    RGBSprite = CreateSprite(#PB_Any, 1, 1, #PB_Sprite_AlphaBlending)  
  EndIf
  
  If OldColor <> Color
    If StartDrawing(SpriteOutput(RGBSprite))
      Plot(0, 0, Color)
      StopDrawing()
    EndIf
    OldColor = Color
  EndIf
  
  If OldWidth <> Width Or OldHeight <> Height
    ZoomSprite(RGBSprite, Width, Height)
    OldWidth = Width
    OldHeight = Height
  EndIf
  
  DisplayTransparentSprite(RGBSprite, x, y, 128)
EndProcedure



If InitSprite() = 0
  MessageRequester("Error", "Can't open screen & sprite environment!", 0)
  End
EndIf
  
If OpenWindow(0, 0, 0, 320, 200, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  If OpenWindowedScreen(WindowID(0), 0, 0, 320, 200)
    
    CreateSprite(0, 50, 50) ; Erstellt ein leeres Sprites, dies wird komplett schwarz sein
    
    Repeat
      
      Repeat
        Event = WindowEvent()
        
        If Event = #PB_Event_CloseWindow
          End
        EndIf
      Until Event = 0
        
      FlipBuffers()
      ClearScreen(RGB(0, 0, 200)) ; Ein blauer Hintergrund
      
      
      DisplaySprite(0, 10, 10)  ; Darstellung unserer schwarzen Box in der linken oberen Ecke
      DisplaySprite(0, 260, 10) ; Darstellung unserer schwarzen Box in der rechten oberen Ecke
      
      DisplayRGBFilter(15, 15, 10 + i, 100, 0, 128, 128)
      i + 1
      If i = 280
        i = 0
      EndIf
    ForEver
      
  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
  EndIf
EndIf
But since I don't know what the original stuff is doing, maybe it is totally wrong.

Bernd
Last edited by infratec on Wed Dec 09, 2015 3:34 pm, edited 1 time in total.
hippy
User
User
Posts: 28
Joined: Tue Mar 05, 2013 3:11 pm

[SOLVED] DisplayRGBFilter() Replacement advice

Post by hippy »

Thank you!


Brilliant, works perfectly!


Cheers,
Hip
infratec
Always Here
Always Here
Posts: 7582
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: DisplayRGBFilter() Replacement advice

Post by infratec »

Good to know.

I just optimized the procedure a bit.

Bernd
infratec
Always Here
Always Here
Posts: 7582
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: DisplayRGBFilter() Replacement advice

Post by infratec »

If you use it more often in one program, maybe a list or a map of the areas is needed to avoid
all time StartDrawing()
User avatar
Demivec
Addict
Addict
Posts: 4260
Joined: Mon Jul 25, 2005 3:51 pm
Location: Utah, USA

Re: DisplayRGBFilter() Replacement advice

Post by Demivec »

infratec wrote:If you use it more often in one program, maybe a list or a map of the areas is needed to avoid
all time StartDrawing()
You don't have to redraw the sprite when it's color changes. Its color is determined by an additional parameter.

Code: Select all

Procedure DisplayRGBFilter(x.i, y.i, Width.i, Height.i, R.i, G.i, B.i)
  
  Static RGBSprite.i = 0
;   Static OldWidth.i, OldHeight.i
  Protected Color.i = RGB(R, G, B)
  
  If Not RGBSprite
    RGBSprite = CreateSprite(#PB_Any, 1, 1, #PB_Sprite_AlphaBlending)  
    If StartDrawing(SpriteOutput(RGBSprite))
      Plot(0, 0, RGB(255, 255, 255))
      StopDrawing()
    EndIf
  EndIf
  
;   If OldWidth <> Width Or OldHeight <> Height
    ZoomSprite(RGBSprite, Width, Height)
;     OldWidth = Width
;     OldHeight = Height
;   EndIf
  
  DisplayTransparentSprite(RGBSprite, x, y, 128, Color)
EndProcedure
I also removed the check IsSprite(RGBSprite) to check for initialization. The 'IsXxxxx()' functions have to go through all existing sprite numbers and are thus a costly way to check for something's existence. Since we are really only checking if we have performed our initialization correctly it is better just to check if the initial value has changed.

I also commented out the check to avoid using ZoomSprite() when it is unnecessary. I think that ZoomSprite() is only setting a value and is not a costly function to use frequently.
Post Reply