Roku Developer Program

Join our online forum to talk to Roku developers and fellow channel creators. Ask questions, share tips with the community, and find helpful resources.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
TwitchBronBron
Streaming Star

Re: how can create dynamic gradient?

Can you be more specific? What does "it does not work" mean? 

0 Kudos
PrahladFusioni
Reel Rookie

Re: how can create dynamic gradient?

When I used color that was mentioned in previous comment in the this function GenerateGradient(1920, 1080, &h00000000, &hFF0000FF, "horizontal"), the gradient is not showing these colors.

0 Kudos
brito
Reel Rookie

Re: how can create dynamic gradient?

Let me show my example.

I need to implement a background label with gradient image.

 

First I implement a new component who just generate an image and by pass some args and returns an uri

Obs: Ignore GroupBase. it is a generic class just to add to any group node some util handlers. In your case just extend group.

<?xml version="1.0" encoding="utf-8" ?>

<!--********** Copyright 2016 Roku Corp. All Rights Reserved. **********-->

<component name="GradientImage" extends="GroupBase" >

<script type="text/brightscript" uri="pkg:/components/GradientImage/GradientImage.brs" />

</component>


in GradientImage.brs I implement as example above with tiny changes

function getLinearGradientUri(width as Integer, height as Integer, startRgba as Integer, endRgba as Integer, lineDirection as String) as String

bitmap = CreateObject("roBitmap", { width: width, height: height, alphaEnable: true })

'draw vertical lines from left to right
if lineDirection = "vertical" then
numSteps# = width
'draw horizontal lines from top to bottom
else
numSteps# = height
end if

' separate rgba values to compute the step between each gradient band
red# = (startRgba and &hFF000000&) >> 24
redEnd# = (endRgba and &hFF000000&) >> 24
redStep# = (redEnd# - red#) / numSteps#

blue# = (startRgba and &h00FF0000&) >> 16
blueEnd# = (endRgba and &h00FF0000&) >> 16
blueStep# = (blueEnd# - blue#) / numSteps#

green# = (startRgba and &h0000FF00&) >> 8
greenEnd# = (endRgba and &h0000FF00&) >> 8
greenStep# = (greenEnd# - green#) / numSteps#

alpha# = startRgba and &h000000FF&
alphaEnd# = endRgba and &h000000FF&
alphaStep# = (alphaEnd# - alpha#) / numSteps#

for i = 0 to numSteps#
red# += redStep#
blue# += blueStep#
green# += greenStep#
alpha# += alphaStep#

'merge rgb into single int
color& = (Int(red#) << 24) + (Int(blue#) << 16) + (Int(green#) << 8) + (Int(alpha#))

if lineDirection = "vertical" then
'draw a line at (i, 0) for the full height of the image
bitmap.DrawRect(i, 0, 1, height, color&)
else
'draw a line at (0, i) for the full width of the image
bitmap.DrawRect(0, i, width, 1, color&)
end if
end for

bitmap.Finish()

png = bitmap.GetPng(0, 0, width, height)
uri = "tmp:/linear-gradient-" + str(width) + "x" + str(height) + "-0x" + stri(startRgba, 16) + "-0x" + stri(endRgba, 16) + "-" + lineDirection + ".png"
png.WriteFile(uri)

return uri
end function


Then, To do a Label I implement a component who use GradientImage and wrap this and pass some util args.

In this case I use to create a background 

<?xml version="1.0" encoding="utf-8" ?>

<!--********** Copyright 2016 Roku Corp. All Rights Reserved. **********-->

<component name="GradientLabel" extends="GradientImage" >

<interface>
<field id="width" type="Int" />
<field id="height" type="Int" />
<field id="paddingTop" value="2" type="Int" />
<field id="paddingRight" value="10" type="Int" />
<field id="paddingBottom" value="2" type="Int" />
<field id="paddingLeft" value="10" type="Int" />
<field id="startRgba" type="LongInteger" />
<field id="endRgba" type="LongInteger" />
<field id="lineDirection" type="String" value="vertical" />
<field id="size" type="String" value="medium" />
<field id="text" type="String" onChange="onContentChanged" />
</interface>

<script type="text/brightscript" uri="pkg:/components/GradientLabel/GradientLabel.brs" />

<children>

<Poster id="gradient" />

<Label
id="label"
horizAlign="center"
vertAlign="center"
/>

</children>

</component>

In GradientLabel.brs

Feel free to do as you want. In my case I did to make an label under text

 

The most important part is this

m.gradient.uri = getLinearGradientUri(m.top.width, m.top.height, m.top.startRgba, m.top.endRgba, "vertical")
sub init()
m.Gradient = m.top.findNode("gradient")
m.Label = m.top.findNode("label")

m.Label.color = getColor("WHITE")
m.Label.observeField("text", "onLabelChanged")
end sub

sub onContentChanged()
m.Label.font = getFontSize(m.top.size)
m.Label.text = m.top.text
end sub

sub onLabelChanged(event)
node = event.getRoSGNode()
rect = node.boundingRect()
setSize(rect)
node.width = m.top.width
node.height = m.top.height

m.Gradient.translation = [
- m.top.paddingRight
- m.top.paddingTop
]

m.Gradient.width = m.top.width + m.top.paddingRight + m.top.paddingLeft
m.Gradient.height = m.top.height + m.top.paddingTop + m.top.paddingBottom

m.gradient.uri = getLinearGradientUri(m.top.width, m.top.height, m.top.startRgba, m.top.endRgba, "vertical")
end sub

function getFontSize(size as String)
if size = "xsmall" then return getFont("OPENSANS_BOLD10")
if size = "small" then return getFont("OPENSANS_BOLD12")
if size = "medium" then return getFont("OPENSANS_BOLD14")
if size = "large" then return getFont("OPENSANS_BOLD18")
if size = "xlarge" then return getFont("OPENSANS_BOLD20")

return getFont("OPENSANS_BOLD14")

end function

sub setSize(rect)
setWidth(rect.width)
setHeight(rect.height)
end sub

sub setWidth(width)
if width > m.top.width then m.top.width = width
end sub

sub setHeight(height)
if height > m.top.height then m.top.height = height
end sub


Using the component GradientLabel

<GradientLabel
size="large"
paddingTop="7"
paddingBottom="7"
paddingRight="0"
paddingLeft="0"
/>
0 Kudos
PrahladFusioni
Reel Rookie

Re: how can create dynamic gradient?

I checked the color is not working

&H00000000,&h00800000,&h00008000,&h00808000,&h00FF0000,&h0000FF00,&h00FFFF00

0 Kudos
TwitchBronBron
Streaming Star

Re: how can create dynamic gradient?

@PrahladFusioni all of your colors have the alpha channel set to 00. Which means all your colors will be fully transparent. 

&H00000000
red=0, green=0, blue=0, alpha=0 

&h00800000
red=0, green=80, blue=0, alpha=0

etc...

If I take your first two colors (&H00000000, &h00800000) but make them fully solid (&H000000FF, &h008000FF) then the gradient works fine. Here is the code:

 

m.gradientPoster.uri = GenerateGradient(1920, 1080, &H000000FF, &h008000FF, "vertical")

 

gradient.png

0 Kudos
Need Assistance?
Welcome to the Roku Community! Feel free to search our Community for answers or post your question to get help.

Become a Roku Streaming Expert!

Share your expertise, help fellow streamers, and unlock exclusive rewards as part of the Roku Community. Learn more.