構文
{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
}
}
|