我正在尝试使用JavaScript绑定将一个简单的cairo图形绘制到Clutter窗口中。我的问题是,除了有一半的函数名称略有不同之外,无论我尝试什么,cairo绘图都不会显示出来。我使用了Python的示例,并将其移植到了JavaScript中。我还使用内省来获取Clutter模块实例。我还使用了gjs版本0.7.14。有人能告诉我出了什么问题吗?
下面是我正在使用的示例代码。
我认为这个不起作用的原因与在JavaScript中删除cairo上下文有关。context.destroy不存在,使用delete也是如此。实际上,如果我使用delete,那么会出现警告。
下面是我正在使用的示例代码。
const cairo = imports.cairo;
const clutter = imports.gi.Clutter;
function on_button_press_event (stage, event) {
clutter.main_quit();
}
function draw(cairo_tex) {
var context = cairo_tex.create();
context.scale(200, 200);
context.setLineWidth(0.1);
var colour2 = new clutter.Color();
colour2.from_string('#dd000088');
clutter.cairo_set_source_color(context, colour2);
context.translate(0.5, 0.5);
context.arc(0, 0, 0.4, 0, Math.PI * 2);
context.stroke();
}
function main () {
clutter.init(0, null);
var stage = new clutter.Stage();
var colour = new clutter.Color();
colour.from_string("#ffccccff");
stage.set_color(colour);
stage.set_size(400, 300);
stage.connect('button-press-event', on_button_press_event);
stage.connect('destroy', clutter.main_quit);
var cairo_tex = new clutter.CairoTexture.new(200, 200);
cairo_tex.set_position((stage.get_width() - 200) / 2,
(stage.get_height() - 200) / 2);
draw(cairo_tex);
var center_x = cairo_tex.get_width() / 2;
var center_z = cairo_tex.get_height() / 2;
cairo_tex.set_rotation(clutter.AlignAxis.Y_AXIS, 45.0, center_x, 0, center_z);
stage.add_actor(cairo_tex);
cairo_tex.show();
stage.show();
clutter.main();
}
main();
我认为这个不起作用的原因与在JavaScript中删除cairo上下文有关。context.destroy不存在,使用delete也是如此。实际上,如果我使用delete,那么会出现警告。
WARNING: 'applying the 'delete' operator to an unqualified name is deprecated'
这完全没有帮助。根据一些参与gjs开发的开发人员发布的内容,将值赋为null应该具有相同的效果,因为它会被垃圾回收。我对是否在幕后收集任何内容表示怀疑。
如果有人能说出这是真的还是假的,那么我将接受这个答案。
更新:
我已经将问题区域缩小到了import.gi.Clutter。我尝试了另一个例子,但这次使用Gtk而不是Clutter,以下代码实际上可以工作。
cairo = imports.cairo;
Gtk = imports.gi.Gtk;
Gdk = imports.gi.Gdk;
function draw_arc(drawing_area){
var cr = Gdk.cairo_create(drawing_area.get_window());
cr.scale(2, 2);
cr.operator = cairo.Operator.CLEAR;
cr.paint();
cr.operator = cairo.Operator.OVER;
cr.setSourceRGB(0,255,0);
cr.arc(128, 128, 76.8, 0, 2*Math.PI);
cr.fill();
return false;
}
Gtk.init(0, null);
var w = new Gtk.Window();
w.connect('delete-event', Gtk.main_quit);
var d = new Gtk.DrawingArea();
w.add(d);
w.resize(500,600);
w.decorated = false;
d.connect('draw', draw_arc);
w.show_all();
Gtk.main();
这让我相信问题不在gjs对cairo的实现上,而是在gjs对Clutter Cairo实现的内省方法上。我认为clutter.CairoTexture.new或clutter.CairoTexture.create没有正确实现。我怀疑是clutter.CairoTexture.create导致了问题。
ClutterTexture
已被弃用。ClutterImage
是替代品,但是对于Cairo集成,您可能需要考虑使用ClutterCanvas
。 - BlackVegetable