使用开罗绘制的画布填充自定义形状的杂波 Actor

2023-12-23

杂乱 1.12
科格尔1.10
Vala 或 C 或 Python。

我在这里可能有一个根本性的误解——

我认为“演员”是 3D 多边形的东西。我将它们的颜色视为顶点颜色或纹理映射。有鉴于此,我一直在尝试绘制一个自定义 Actor 并用通过 Cairo 绘制的内容填充它。我一事无成。

代码包含在下面(在 Vala 中)。任何人都可以让我正确了解 Clutter 的基础知识(文档只是没有削减它),或者,如果我很接近,请帮助我让代码正常工作。

我希望看到一个圆角矩形,里面有一个笑脸。相反,我看到的是 Cogl 路径填充覆盖*脸部。我thinkPaint() 在drawme() 之后完成

*如果您在方法paint() 中将Clutter.Color 设置为“#0001”,您将看到这一点。

/*

Clutter Actor with custom paint() and filled with a Cairo-drawn texture.
(NOT yet working.)

Compile with:

    valac \
  --pkg clutter-1.0 \
  --pkg cogl-1.0 \
    somename.vala

*/


public class SmileyRect : Clutter.Actor {

  //private vars
  private Clutter.Canvas _canvas;
  private bool _flip = false;
  private int _w = 300;
  private int _h = 300;

  //Constructor
  construct {
    _canvas = new Clutter.Canvas();
    _canvas.set_size( this._w, this._h );

    this.set_size( this._w, this._h );
    this.set_content( _canvas );

    //Connect to the draw signal - this is as-per Clutter docs.
    _canvas.draw.connect( drawme );

    //Make it reactive and connect to the button-press-event
    this.set_reactive( true );
    this.button_press_event.connect( button_press );
  }

  /*
    Button press signal handler.
    Changes the colour of what will be painted on the canvas.
  */
  private bool button_press ( Clutter.ButtonEvent evt ) {
    this._flip = !this._flip; //Jiggle a value.
    this.redraw(); // Forces re-run of the drawme() method.
    return true; //all done with this signal.
  }

  //Common function to draw Cogl stuff - used in paint and pick.
  private void draw_rr( Clutter.Color? color ) {
    if (color != null ) { Cogl.set_source_color4ub(color.red,color.green,color.blue,color.alpha); }
    Cogl.Path.round_rectangle( 0, 0, this._w, this._h, 15, 0.3f );
    Cogl.Path.close();

    // When from paint(): 
    // Is there some way to fill this Cogl path with the contents
    // of this._canvas? Or some other paradigm?
    if (color != null ) { Cogl.Path.fill(); }
  }

  /* Some kind of freaky, this magic paint() thing.
     Took me ages to get it running.
     I want to draw a rounded rectangle as the basic shape
     of this actor. 
  */
  public override void paint() {
    stdout.printf("paint runs.\n");
    // I did try a transparent color #0000 - just to see. No go.
    // #000f - draws a black rounded rect *OVER* the Cairo canvas. It covers
    // the smiley face.
    this.draw_rr( Clutter.Color.from_string("#0000") );
  }


  /* I followed paint() example, but the argument was tricky.
     I eventually found it from some PyClutter source code. 
  */
  public override void pick(Clutter.Color color) {
    stdout.printf("pick runs.\n");
    this.draw_rr( color );
  }

  /*
    Draws the Cairo art to the canvas.
    I want this art to be the bitmap/pixmap that *fills* the
    basic rounded rectangle shape of this actor.
    i.e I want the smile face cairo rectangle to be *within* the
    polygon that is draw via Cogl in paint() method.

    Does this even make sense?
  */
  private bool drawme( Cairo.Context ctx, int width, int height) {
    //Draw a rectangle
    double[] col;
    if (this._flip) {
      col = {1f,0f,0f};
      } 
    else {
      col = {0f,1f,0f};
    }

    ctx.set_source_rgb( col[0], col[1], col[2] );
    ctx.rectangle( 0, 0, width, height );
    ctx.fill();

    //Draw a smiley face.

    // Aside: Been trying to avoid all the weird casting of the floats/doubles used below
    // (see the generated c source.) Not at all sure what's going on there.
    // Also not sure about that 'f' on the numbers. Where/when do I have to use it?

    double pi = 3.14f;
    double w = (double) width;
    double h = (double) height;

    ctx.set_line_width( 6f );

    ctx.set_source_rgb( 0f, 0f, 0.8f );

    //eyes
    ctx.move_to( w/3f, h/3f );
    ctx.rel_line_to( 0f, h/6f );
    ctx.move_to(  2*(w/3f), h/3f );
    ctx.rel_line_to( 0f, h/6f );
    ctx.stroke();

    ctx.set_source_rgb( 1f, 1f, 0f );

    double rad = (w > h) ? h : w;
    //face
    ctx.arc( w/2f, h/2f, (rad/2f) - 20f,0f,2f * pi );
    ctx.stroke();
    //smile
    ctx.arc( w/2f, h/2f, (rad/3f) -10f, pi/3f, 2f * (pi/3f) );
    ctx.stroke();

    return true;
  }

  //Redraw - forces invalidate which trips the draw event
  public void redraw() {
    this._canvas.invalidate();
  }
} //end SmileyRect class



void main( string[] args ) {
  Clutter.init(ref args);

  var stage = new Clutter.Stage();
  stage.set_size(400,400);

  var rs = new SmileyRect();
  stage.add_child(rs);
  rs.redraw();

  stage.destroy.connect(Clutter.main_quit);
  stage.show();
  Clutter.main();

}

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用开罗绘制的画布填充自定义形状的杂波 Actor 的相关文章

  • 不支持链接到“Gtk.Box.new”

    我是 Vala 的新手 到目前为止我认为它很酷 但我在理解继承方面遇到了困难 我读here我应该使用base 调用父构造函数 好吧 很酷 似乎可以理解 但它对我不起作用 我一直收到标题上的错误 这是我要展示的片段 public class
  • 如何在 Gtk 2 窗口上创建 cairo_t

    我有一个旧的应用程序 现在在 Gtk 2 上编译 但我需要介绍一下 Cairo 的使用 我不知道如何从我的小部件创建必要的 cairo 上下文 cairo t 这是我到目前为止正在尝试学习的代码 是从 Gtk 3 教程中修改的 咳咳 抄袭
  • Flatpak Meson 没有从 Gnome Builder 中找到 Vala 库

    在 Linux 中 我在 Gnome Builder 3 26 4 中使用 Meson 0 44 0 作为将使用 Gee 和 GXml 的控制台程序 我的目的是在 Genie 中写这个 当我在 Gnome Builder 中使用 Meson
  • GtkDrawingArea - 如何使其可绘制?

    我有点失去理智了 我正在尝试使用 cairo 在 GTK 表单上绘制一些简单的图形 include
  • Open Type字体问题

    基本上 这是一个显示少数民族语言的问题 让我简单说一下 我一直在尝试让我的 Opentype 字体 其中有一些功能 在非 Windows 在 Windows 上 它工作正常 平台 Android iOS 等 上正常工作 我真正要处理的是一个
  • 如何在 GTK 中的其他小部件上渲染具有透明背景的文本?

    我希望在其他 gtk 小部件 如 GtkImage 或 GtkButton 等 上渲染具有透明 半透明背景 或无背景 的文本 主要目标是在后台的 Gtk Widget 尤其是 GtkImage 上显示文本 我可以使用 pangocairo
  • GTK# 中的 Gtk 主题 (Windows)

    我正在尝试更改 GTK 中的主题 操作系统 Windows IDE Xamarin 但我遇到了下一个问题 我只能找到一个正确渲染的主题 它是 Orta 一切都很好 除了滞后和冻结 这是我的代码 string Resource File Or
  • 在 anaconda python 发行版中添加 cairo 包

    我刚开始使用 python 的 anaconda 发行版 并且在安装 cairo 包时遇到问题 请注意 我使用的是 Mac OsX 我运行了以下命令conda install channel https conda binstar org
  • 使用开罗绘制的画布填充自定义形状的杂波 Actor

    杂乱 1 12科格尔1 10Vala 或 C 或 Python 我在这里可能有一个根本性的误解 我认为 演员 是 3D 多边形的东西 我将它们的颜色视为顶点颜色或纹理映射 有鉴于此 我一直在尝试绘制一个自定义 Actor 并用通过 Cair
  • 如何在GtkTreeview中用字符串和pixbuf制作一列?

    我正在使用 Gtk 2 的应用程序中工作 我需要实现一个文件树视图 实际的代码是 public FileTree store new TreeStore 2 typeof string typeof string this change d
  • Gee HashMap 包含方法作为值

    我正在尝试填充 Libgee HashMap 其中每个条目都有一个字符串作为键 一个函数作为值 这可能吗 我想要这样的东西 var keybindings new Gee HashMap
  • 安装 Cairo 和 PyCairo Mac OsX

    我正在尝试使用 python iGraph 进行网络可视化 当我尝试绘制图表时 我收到了他的错误消息 gt gt gt layout g layout kk gt gt gt plot g layout layout Traceback m
  • 开罗图书馆和 Cmake

    我是 c 和 cmake 的新手 我按照所写安装了开罗库here https cairographics org download 通过端口 现在我想将开罗纳入我的项目中 我编写了 CmakeLists txt 命令 如图所示here ht
  • 如何开始编写合成 WM?

    我想编写一个基本的硬件加速窗口管理器 所以我一直在寻找一些有关如何开始的文档 但我只找到了本教程 http wingolog org archives 2008 07 26 so you want to build a compositor
  • 如何在 vapi 文件中编写 void 指针类型定义?

    我正在尝试编写一个 VAPI 文件来使用 unixODBC 其中一个函数被称为SQLAllocHandle From
  • 如何在 osx 上安装 pycairo?

    我正在尝试安装pycairo http cairographics org pycairo Python 绑定开罗图形库 http cairographics org 在 OSX 下 我开始于 easy install pycairo 并得
  • 在Gtk中,是否可以使小部件淡入淡出?

    我想要一个Label 或者至少是标签上的文字 进行快速淡入 看起来这是可能在混乱中 http blog didrocks fr index php post Design experience and demos in GTK Clutte
  • Vala:传递通用数组会破坏值

    如何将数组传递给通用函数 以下代码确实可以编译 但输出有些损坏 void foo
  • 我如何将 C++ 与 VALA 混合起来

    我需要用 C 编写跨平台的 GUI 应用程序 但由于 C 的大多数 GUI 库都有点乏味 而且我对 C NET 非常熟悉 我发现使用 GTK 的代码 Vala 代码非常有趣 并且与其他方式相比有点容易 那么我该如何将 VAlA 与 C 混合
  • linux下无法安装Cairo包

    我在本地下载该软件包并尝试安装它 但出现此错误 R CMD INSTALL l usr local lib64 R library Cairo 1 5 1 tar gz 我得到他的错误 checking for PNG support in

随机推荐

  • 如何使用 Tesseract-android-Tools

    我有 tesseract android tools 1 00 请帮助我使用 TessBaseAPI 接口 我只想将一个 jpg 图像传递给一个 Android 应用程序 该应用程序将一些文本作为图像的一部分 然后通过这个超立方体引擎我想将
  • Firefox 无法正确渲染 svg

    我在 Firefox 中遇到了这个问题 或者可能是我使用了错误的东西 但我使用的是这样的 svg 图像 img src image svg alt some image 浏览器将它们呈现如下 我可以让他们像 png它工作得很好 但我需要它们
  • PHP字符串计算[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我的问题是 在 PHP 中如何从字符
  • System.InvalidOperationException:异步操作尚未完成

    安装导致 Ml net 异常的管道 这Fit不是一个等待的事情 我很困惑为什么会发生这种情况 任何帮助都是值得赞赏的 var model pipeline Fit dataView 堆栈跟踪 在 System Threading Chann
  • 启动时自动运行 EFI 应用程序

    I can 构建并手动执行 http sourceforge net apps mediawiki tianocore index php title Getting Started Writing Simple ApplicationUE
  • Python:返回完整单词而不仅仅是字符串的特定部分(正则表达式)

    我最近刚刚开始学习 Python 并且已经 深入 到了正则表达式 我的任务看起来相当简单 我只需要编写一个从字符串返回某些单词的正则表达式 规则如下 单词只能包含一组元音 换句话说 它是一个不完美但简单的正则表达式 旨在从文本中返回一个音节
  • 获取Python中类的类路径或名称空间,即使它是嵌套的

    我目前正在用 Python 编写一个序列化模块 可以序列化用户定义的类 为了做到这一点 我需要获取对象的完整名称空间并将其写入文件 然后我可以使用该字符串重新创建该对象 例如 假设我们在名为的文件中有以下类结构A py class B cl
  • Nifi 无法使用 POI API 将 CSV 转换为 Excel

    我想使用 groovy 脚本 POI API 将 csv 流文件内容转换为 XLS 文件 我正在使用 ivy 来获取 POI 依赖项 看起来效果很好 请在下面找到更多详细信息 这是我的 Nifi 流程 这是我的脚本 Grapes Grab
  • .asciz 和 .string 汇编器指令之间有什么区别?

    我知道 ascii指令不会在字符串末尾放置空字符 因为 asciz指令就是用于此目的 不过 我不知道是否 string指令在字符串末尾放置一个空字符 如果它确实附加了空字符 那么两者之间有什么区别 asciz和 string指令 对我来说
  • 通过 javascript 自定义验证器错误文本?

    我想通过客户端 JavaScript 设置 ASP net 自定义验证器错误参数文本 如何通过函数中的 sender args 参数访问它 您需要做的就是在中定义回调方法客户端验证函数 http msdn microsoft com en
  • 适用于租户范围的 Firebase 电子邮件模板

    我修改了 重置密码 的电子邮件模板 如果用户超出 Identity Planform 的租户范围 该模板可以正常工作 但是当用户位于租户范围内时 模板不起作用 用户超出范围 IDP https i stack imgur com CNO8S
  • 对象不是来自此工作单元

    我收到一条错误消息 异常 EclipseLink 6004 对象 bla bla 不是来自此 UnitOfWork 对象空间 而是来自父会话的对象空间 该对象从未在此 UnitOfWork 中注册 这是随机出现的异常 有谁知道如何解决这个问
  • 如何使用 Xamarin for Android 将数据从 MediaCodec 流式传输到 AudioTrack

    我正在尝试解码 mp3 文件并将其流式传输到 AudioTrack 一切正常 但会在 Java 端导致大量 GC 我确保不在播放 流循环中分配内存 并将分配临时 Java 数组的责任归咎于 ByteBuffer Get byte int i
  • 如何使用 Firebug 和 Chrome 开发者工具调试不同媒体查询中的 css?

    如何在 Chrome 开发者工具中调试 css 的orientation portrait 我在里面写了什么 orientation portrait 无法通过 Firebug 和 Chrome 开发者工具进行即时编辑 它始终显示正常属性
  • UnicodeEncodeError [Python3/Gunicorn/Nginx/Django]

    Solved 当我按照中的说明进行操作时发生此错误here https www digitalocean com community tutorials how to set up django with postgres nginx an
  • 调用 Html.BeginForm 并指定操作

    我一直在尝试执行以下操作 但无论我尝试什么 我都会不断收到不同的错误 using Html BeginForm Url Action this ViewContext RouteData Values action as string 例如
  • 为什么 ggplot 不允许抑制其 geoms 生成的消息?

    The geom density ridges几何从ggridges包创建了山脊线 如果未指定带宽 它会尝试找到一个合理的值 然后它使用base R message报告该值的函数 参见https twitter com ClausWilke
  • javascript XSLT 节点,选择组中的第一个(类似合并)

    阅读了这里的一些合并帖子后 我的问题似乎更简单 我无法找到答案 所以我发布了一个新问题 原始 XML
  • 删除全部还是销毁全部?

    我正在寻找从表中删除记录的最佳方法 例如 我有一个用户 其用户 ID 跨多个表 我想删除这个用户以及所有表中包含他的 ID 的每条记录 u User find by name JohnBoy u usage indexes destroy
  • 使用开罗绘制的画布填充自定义形状的杂波 Actor

    杂乱 1 12科格尔1 10Vala 或 C 或 Python 我在这里可能有一个根本性的误解 我认为 演员 是 3D 多边形的东西 我将它们的颜色视为顶点颜色或纹理映射 有鉴于此 我一直在尝试绘制一个自定义 Actor 并用通过 Cair