1

Clutter/cairo をいじっていて、四角形を描こうとしています。ただし、set_source_rgb長方形を描画するように指示するかどうかに関係なく、キャンバス全体をソースで自動的にペイントしているように見えます (つまり、ctx.rectangle()線を削除してもctx.fill()、長方形は引き続き描画されます)。どうしてこれなの?そして、set_source_rgb ではなく四角形でペイントするにはどうすればよいでしょうか?

public class AnActor : Clutter.Actor {

    public Clutter.Canvas canvas;

    public AnActor() {
        canvas = new Clutter.Canvas();
        canvas.set_size(300,300);

        this.set_content( canvas );
        this.set_size(300,300);

        //Connect to the draw signal.
        canvas.draw.connect(drawme);
    }

    private bool drawme( Cairo.Context ctx, int w, int h) {
        stdout.printf("Just to test this ran at all: %d\n", w);

        ctx.scale(w,h);
        ctx.set_source_rgb(0,0,0);

        //Why is this rectangle drawn even when I remove these lines?
        ctx.rectangle(0,0,200,200);
        ctx.fill();

        ctx.paint();

        return true;
    }
}



int main(string [] args) {
    // Start clutter.
    var result = Clutter.init(ref args);
    if (result != Clutter.InitError.SUCCESS) {
        stderr.printf("Error: %s\n", result.to_string());
        return 1;
    }

    var stage = Clutter.Stage.get_default();
    stage.destroy.connect(Clutter.main_quit);

    //Make my custom Actor:
    var a = new AnActor();
    stage.add_child(a);
    a.canvas.invalidate();

    stage.show_all();

    Clutter.main();
    return 0;
}
4

1 に答える 1

3

drawme メソッドには実際にはいくつかの誤解があるように思えます。

ctx.scale(w,h);

後で何をするかから判断すると、これは、0,0 から 300,300 の間のものを描画できるように、自分が行っていることをスケーリングしたいということを意味しているようです。あなたが実際に行っていることは、別の方向に進んでいるということです... この線をそのままにしておくと、0,0 と 1,1 の間で描画する必要があります。

ctx.rectangle(0,0,200,200);
ctx.fill();

ここでは、原点から 200 * キャンバスの幅と高さまでの長方形を求めています。それを変更するとctx.rectangle (0, 0, 0.67, 0.67)、結果はあなたが望んでいたものに近づくはずです。または、先に述べたように、電話を切ることもできctx.scale(w,h);ます。

ctx.paint();

cairo_paintのドキュメントを参照してください。「現在のクリップ領域内のすべての場所で現在のソースを描画する描画演算子」必要なのは、現在のパスを埋めることです。これは、cairo_fillが行うことです。クリップ領域を定義していないため、コンテキスト全体が満たされます。

別の方法として、 cairo_clipでクリップ領域を作成することもできます。ctx.clip ();の直前に追加するだけctx.paint ();です。おそらく、cairo_save と cairo_restore を使用することをお勧めします。cairo_clip のドキュメントで説明されています。

于 2013-04-15T04:47:18.490 に答える