Предположим, у меня есть класс C ++:
class cRenderer {
...
virtual void draw();
...
}
Это часть механизма рендеринга, поэтому любой класс C ++, который наследует cRenderer
может переопределить draw
метод и рисовать вещи на экране.
Вопрос в том, как я могу реализовать такое же поведение с привязками v8 (в конечном итоге это будет модуль Node.js)?
Можно сказать, я могу сделать это:
class cApplication : public cRenderer, public node::ObjectWrap
{
... define bindings ...
}
Затем в моем JavaScript я делаю что-то вроде:
var app = new cApplication();
var oldDraw = app.draw; //saving old instance of draw
app.draw = function() {
... do drawing api calls ...
oldDraw(); //calling old draw
}
Это не сработает, потому что все вызовы API рисования происходят за пределами draw
.
Более конкретно, как привязки JS могут вставлять динамические вызовы API в draw
метод? Как можно решить эту проблему? Пожалуйста, помните, редактирование архитектуры движка рендеринга не вариант.
РЕДАКТИРОВАТЬ:
Снаружи и внутри draw
Я имел в виду:
drawCircle(100, 100, 11); //outside of render loop
draw(); //nothing happens at this point.
Но если у вас был вызов внутри метода draw:
void draw()
{
//inside of render loop
drawCircle(100, 100, 11); //it draws a circle at (100, 100) with radius 11
}
мой Sciter Двигатель использует так называемую модель непосредственного рисования. Я очень подозреваю, что вы пытаетесь сделать то же самое здесь.
Непосредственная модель рисунка:
К любому элементу DOM в Sciter могут быть прикреплены «обработчики рисования»:
var someEl = ...
someEl.paintBackground = function(gfx) {... }
someEl.paintContent = function(gfx) {... }
...
Такие художники будут вызываться нативным кодом, когда элемент должен быть нарисован.
На всякий случай, в HTML / CSS элемент рисунка разбит на несколько слоев: фон, контент, передний план / контур.
Вот как реализован нативный draw_background, например:
class Element {
void draw_background(graphics* gfx) {
if( has_paintBackground() ) {
if(invoke(paintBackground, object_wrap(gfx)) == TRUE_VALUE)
return; // default background drawing was suppressed by script
}
default_draw_background(gfx);
}
}
В этом случае скрипт может нарисовать что-то под фоновым слоем элемента, поверх него или даже полностью вместо рендерера по умолчанию.
ОБНОВИТЬ:
Объект сценария, созданный object_wrap (gfx), связан с реальной поверхностью рендеринга только внутри вызовов рендеринга. Любая попытка сохранить и использовать этот объект gfx в другом месте приведет к ошибке: «неверная поверхность рендеринга».
Я не уверен, но подозреваю, что вам нужно что-то подобное.