2013-04-15 65 views
1

我正在玩雜波/開羅,我試圖畫一個矩形;但是,看起來set_source_rgb會自動繪製整個畫布及其來源,無論我是否告訴它繪製矩形(即,即使刪除了ctx.rectangle()ctx.fill()線條,矩形仍然繪製)。爲什麼是這樣?我需要做什麼才能讓矩形做繪畫而不是set_source_rgb?爲什麼Cairo.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; 
} 

回答

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.paint();之前添加ctx.clip();即可。你可能會想使用cairo_save和cairo_restore - cairo_clip的文檔解釋它。

+0

這解決了它。謝謝!我去掉了調用'paint()'和'scale()'。 – weberc2