構文
{mutate-fill-pattern
dst: [, drawable:Drawable]
on do
}
{mutate-fill-pattern dst:Renderer3d, drawable:Drawable on fill-pattern do ... }
説明
例
例: Pixmap を使用した FillPattern の変更 | |
{import * from CURL.GRAPHICS.RENDERER3D} || for Color {value let original-fill-pattern:FillPattern = {FillPattern.from-url {url "curl://install/docs/default/images/adria.jpg"}} let mutated-fill-pattern:FillPattern = {original-fill-pattern.clone} {mutate-fill-pattern pixmap:Pixmap on mutated-fill-pattern do let hue:FloatAngle let saturation:FloatFraction let value:FloatFraction let red:Fraction let green:Fraction let blue:Fraction {for-pixel pixel:Pixel at x:int, y:int in pixmap do || Select the blue shirt using this heuristic: {if pixel.red < 0.65f and pixel.blue > 0.6f and pixel.green > 0.4f then set (hue, saturation, value) = {Color.rgb-to-hsv pixel.red, pixel.green, pixel.blue} || Adjust the hue of the shirt. set hue = 0deg asa FloatAngle set value = value + 0.2f {if value > 1.0f then set value = 1.0f } set (red, green, blue) = {Color.hsv-to-rgb hue, saturation, value} set pixel = {Pixel.create red, green, blue} } } } {HBox {Fill width = 2.5in, height = 2.5in, background = original-fill-pattern}, {Fill width =2.5in, height = 2.5in, background = mutated-fill-pattern} } } |
例: Renderer3d を使用した FillPattern の変更 | |
{import * from CURL.GRAPHICS.RENDERER3D} {define-proc public {render-gouraud-lens r:Renderer3d}:void {render-primitive p:Primitive, type = PrimitiveType.quads on r do {p.color3 1.0, 0.0, 0.0} {p.vertex2 0cm, 0cm} {p.color3 0.0, 1.0, 0.0} {p.vertex2 0cm, 1cm} {p.color3 0.0, 0.0, 1.0} {p.vertex2 1cm, 1cm} {p.color3 0.0, 0.0, 0.0} {p.vertex2 1cm, 0cm} } } {value let original-fill-pattern:FillPattern = {FillPattern.from-url {url "curl://install/docs/default/images/adria.jpg"}} let mutated-fill-pattern:FillPattern = {original-fill-pattern.clone} {mutate-fill-pattern renderer:Renderer3d on mutated-fill-pattern do {renderer.modelview-matrix.load-identity} {render-primitive p:Primitive, type = PrimitiveType.quads on renderer do {p.color3 0.0, 0.0, 0.0} {p.vertex2 1.2cm, 3cm} {p.vertex2 1.2cm, 3.2cm} {p.vertex2 5.3cm, 3.2cm} {p.vertex2 5.3cm, 3cm} } {renderer.modelview-matrix.load-identity} {renderer.modelview-matrix.translate 2.1cm, 2.7cm, 0cm} {render-gouraud-lens renderer} {renderer.modelview-matrix.load-identity} {renderer.modelview-matrix.translate 3.5cm, 2.7cm, 0cm} {render-gouraud-lens renderer} } {HBox {Fill width = 2.5in, height = 2.5in, background = original-fill-pattern}, {Fill width =2.5in, height = 2.5in, background = mutated-fill-pattern} } } |
例: Renderer2d を使用した FillPattern の変更 | |
{import * from CURL.GRAPHICS.IMAGEFILTER} {import * from CURL.GRAPHICS.RENDERER3D} || for Color {value let original-fill-pattern:FillPattern = {FillPattern.from-url {url "curl://install/docs/default/images/adria.jpg"}} let mutated-fill-pattern:FillPattern = {original-fill-pattern.clone} let rotate-angle:Angle = 0deg let r:Fraction let g:Fraction let b:Fraction let h:Angle = 0deg let constant s:Fraction = 0.6 let constant v:Fraction = 0.6 let pixmap:Pixmap = {Pixmap 64, 64} let fill:Fill = {Fill width = 2.5in, height = 2.5in, background = mutated-fill-pattern} {for-pixel pixel:Pixel at x:int, y:int no-read in pixmap do {if x <= 32 and y >= 0 then set pixel = {Pixel.create 0.0, 0.0, 0.0} else set pixel = {Pixel.create 1.0, 1.0, 1.0} } } let fill-pattern:FillPattern = {FillPattern.from-pixmap pixmap} let original-twirly:FillPattern = {twirl angle=600deg, fill-pattern} set original-twirly = {blur original-twirly, amount = 50%} let timer:Timer = {Timer interval = 50ms, {on timer-event:TimerEvent do {inc rotate-angle, 45deg} {inc h, 10deg} {if h > 360deg then set h = 0deg } set (r, g, b) = {Color.hsv-to-rgb h, s, v} let rotated-fill-pattern:FillPattern = {rotate original-twirly, angle=rotate-angle } set rotated-fill-pattern = {rgb-scale red = r, green = g, blue = b, rotated-fill-pattern } {mutate-fill-pattern renderer2d:Renderer2d on mutated-fill-pattern do {renderer2d.render-rectangle 1.2cm, 3cm, 4cm, 2mm, fill-pattern = {FillPattern.get-black} } {renderer2d.render-ellipse 2.1cm, 2.7cm, 1cm, 1cm, fill-pattern = rotated-fill-pattern } {renderer2d.render-ellipse 3.5cm, 2.7cm, 1cm, 1cm, fill-pattern = rotated-fill-pattern } } || Note that it is not necessary to || request a redraw from the GUI; || mutate-fill-pattern and the GUI || toolkit play nice together! } } {HBox {Fill width = 2.5in, height = 2.5in, background = original-fill-pattern}, fill } } |