gjs cairo context drawing не отображается в окне беспорядка

Я пытаюсь получить простой рисунок cairo, нарисованный в беспорядочном окне, используя привязки javascript. Моя проблема в том, что помимо того, что половина функций названа немного по-другому, что бы я ни пытался, рисунок cairo не отображается. Я использовал пример из python, который действительно работает, и перенес его на javascript. Я также использую интроспекцию, чтобы получить экземпляр модуля Clutter. Еще я использую gjs версии 0.7.14. Кто-нибудь может сказать мне, что происходит не так.

Ниже приведен пример кода, который я использую.


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();

Я думаю, что причина, по которой это не работает, связана с удалением контекста cairo в javascript. context.destroy не существует, и использование delete также не существует. Фактически, если я использую delete, я получаю предупреждение

WARNING: 'applying the 'delete' operator to an unqualified name is deprecated'

, которое вообще не помогает. Согласно тому, что об этом писали некоторые разработчики, участвующие в gjs, присвоение null должно иметь тот же эффект, так как это сборщик мусора. У меня есть сомнения относительно того, есть ли что-нибудь, что можно собирать за кулисами.

Если бы кто-то мог сказать, правда это или нет, я бы принял это как ответ.

ОБНОВЛЕНИЕ:

Я сузили проблемную область до imports.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();

Это заставляет меня поверить, что проблема не в реализации cairo gjs, а в методах интроспекции gjs для реализации Clutter Cairo. . Я думаю, что clutter.CairoTexture.new или clutter.CairoTexture.create не реализованы должным образом. Я подозреваю, что проблема заключается в clutter.CairoTexture.create.

5
задан James Hurford 5 August 2011 в 11:32
поделиться