mutate-fill-pattern (マクロ)
インポート元: CURL.GUI.STANDARD. package 内で定義されています CURL.GRAPHICS._2D.RENDERER2D.

FillPattern のミューテーションを有効にします。

構文

{mutate-fill-pattern
        dst:kind[, drawable:Drawable]
        on fill-pattern do
        body
    }


説明:

説明

PixmapRenderer3d または Renderer2d のいずれかの API を使用できます。

次の 3 つの例では、3 つのメカニズムをそれぞれ使用して、ターゲット FillPattern を変更する mutate-fill-pattern を示します。
例: 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
    }
}