- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 javascript 绑定(bind)将简单的 cairo 绘图绘制到杂乱的窗口中。我的问题是,除了一半的函数命名略有不同外,无论我尝试什么,cairo 绘图都不会显示。我使用了一个来自 python 的示例,它确实有效,并将其移植到 javascript。我还使用内省(introspection)来获取 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();
我认为这不起作用的原因与删除 javascript 中的 cairo 上下文有关。 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 实现,而在于 Clutter Cairo 实现的 gjs 自省(introspection)方法。我在想 clutter.CairoTexture.new 或 clutter.CairoTexture.create 没有正确实现。我怀疑是 clutter.CairoTexture.create 导致了问题。
最佳答案
使用 Clutter 和 Cairo 之间较新的集成,特别是 Clutter.Canvas
这将在屏幕上绘制一个圆圈:
const Clutter = imports.gi.Clutter;
const Cairo = imports.cairo;
const draw_stuff = function (canvas, cr, width, height) {
cr.save ();
cr.setOperator (Cairo.Operator.CLEAR);
cr.paint ();
cr.restore ();
cr.setOperator (Cairo.Operator.OVER);
cr.scale (width, height);
cr.setLineCap (Cairo.LineCap.ROUND);
cr.setLineWidth (0.1);
cr.translate (0.5, 0.5);
cr.arc (0, 0, 0.4, 0, Math.PI * 2);
cr.stroke ();
return true;
};
const test = function () {
Clutter.init(null);
let stage = new Clutter.Stage();
stage.set_title ("Circle!");
let color = new Clutter.Color({
red : 255,
green : 0,
blue : 0,
alpha : 128 // Just for the heck of it.
});
stage.set_background_color(color);
stage.set_size(300, 300);
let canvas = new Clutter.Canvas ();
canvas.set_size (155, 155);
let dummy = new Clutter.Actor ();
dummy.set_content (canvas);
dummy.set_size(155, 155);
stage.add_child (dummy);
stage.connect ("destroy", Clutter.main_quit);
canvas.connect ("draw", draw_stuff);
canvas.invalidate ();
stage.show_all();
Clutter.main ();
};
test ();
关于javascript - gjs cairo 上下文绘图未显示在杂乱窗口中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6590227/
过去我在学习 Cairo 时拍过一些照片,但总是继续支持其他一些图形库。我的问题是我找不到一个很好的教程来为我的表面提供一个简单的显示。我总是在 GTK 或 QT 文档中挖掘与我想做的事情无关的事情。
我的看法 @api_view(['GET']) @renderer_classes((JSONRenderer,TemplateHTMLRenderer,BrowsableAPIRendere
这听起来很简单,但我找不到将 PDF 加载到开罗的方法。我希望能够以与 cairo.ImageSurface.create_from_png 相同的方式执行 cairo.PDFSurface.crea
我在让 Pango Cairo 自动换行时遇到问题。下面是一些演示代码。我将布局的宽度设置为与红色矩形相同,因此我希望它环绕到红色矩形。实际上,它只是在每一行上放置一个单词,就好像宽度设置得很小一样。
这是我的观点: from django.conf import settings from django.http import HttpResponse from django.template.l
我想在 linux (fedora 12) 下使用 GTK 3 创建一个窗口,并使用 cairo-gl 后端在其上绘制一个简单的矩形,为此我想创建一个 cairo-gl 表面。我该怎么做,任何人都可以
我正在尝试从线程绘制到 cairo 图像表面,但出现断言错误: gtk_mt: /build/buildd/cairo-1.10.2/src/cairo-surface.c:385: _cairo_s
我收到 OSError: dlopen() failed to load a library: cairo / cairo-2在新安装后尝试执行 Django 时。使用 Windows。 根据完整的跟
我正在运行 OSX Lion 并尝试为 goocanvas 导入 python 模块, 使用 python2.7. 我设法成功编译了 pygoocanvas-0.14.1,但是当我尝试通过 pytho
我正在使用 Stack 和 Nix 构建一个 Haskell 项目,并依赖于来自 Hackage 的 cairo 库。 当我构建项目时,出现错误:无法找到 pkg-config >= 0.9.0 或
我是开罗的新手,我已经阅读了其网站上的教程/文档。 现在我可以制作线条、矩形,基本上我可以渲染图像但不能渲染文本。 我正在使用以下代码 cairo_select_font_face (cr, "mon
根据cairo example code ,以下代码 double x=25.6, y=128.0; double x1=102.4, y1=230.4, x2=153.6, y2=2
我在两个位置安装了 python,在操作系统中默认为 2.6.6,在/usr/local/bin/python2.7 中为 2.7。 我已经使用 configure/make/make install
我希望我在开罗的文本遵循绘制的路径。类似于 this . 现在这个链接来自a post在声称已经对此进行编码的开罗邮件列表中。只有代码链接位于 svn.gnome.org这似乎已被撤下。我的问题是,有
我正在尝试学习如何使用 Cairo 2D drawing library与 xlib 曲面。 我编写了一个允许创建多个窗口的小测试程序。每个函数可能有一个自定义的paint()函数,定期调用该函数以向
如果我们不检查 cairo 上下文是否存在会发生什么,如果返回 false 会发生什么,例如: bool MyClass::on_draw(const Cairo::RefPtr& cr) {
我在尝试运行以下命令时不断收到此错误: python -m weasyprint http://weasyprint.org weasyprint.pdf 错误: raise OSError("d
我有一个简单的 Cairo 程序,它试图在 600x600 PNG 中绘制由点组成的对角线。但是,每当我尝试使用对 cairo_stroke() 的一次调用来渲染所有点时,输出似乎被截断了。 具体来说
我有一个 cairo_t cr,我可以用它来使用 cairo。我想尝试在这个 cairo 图形上创建一个突出显示效果,它应该执行以下操作之一: 调亮整个图像,使其看起来更亮一些 将背景,即图像的透明部
我正在使用 C++ 和 GTK3 开发一个应用程序,但我被卡住了。我用 glade 创建了一个可视化应用程序,它具有三列,其中一列(中间一列)是 DrawingArea。在那个 DrawingArea
我是一名优秀的程序员,十分优秀!