原文: http://zetcode.com/gui/javascriptgtktutorial/cairo/

在 JavaScript GTK 教程的这一部分中,我们将使用 Cairo 库进行一些绘图。 目前,Seed 仅支持 Cario 库的一小部分。

Cairo 是用于创建 2D 矢量图形的库。 我们可以使用它来绘制自己的小部件,图表或各种效果或动画。

色彩

在第一个示例中,我们将处理颜色。 颜色是代表红色,绿色和蓝色(RGB)强度值的组合的对象。 Cario 有效 RGB 值在 0 到 1 的范围内。

  1. #!/usr/bin/seed
  2. /*
  3. ZetCode JavaScript GTK tutorial
  4. In this program, we will draw three
  5. colored rectangles on the drawing area
  6. using Cairo
  7. author: Jan Bodnar
  8. website: www.zetcode.com
  9. last modified: July 2011
  10. */
  11. Gtk = imports.gi.Gtk;
  12. cairo = imports.cairo;
  13. Gtk.init(null, null);
  14. Example = new GType({
  15. parent: Gtk.Window.type,
  16. name: "Example",
  17. init: function ()
  18. {
  19. init_ui(this);
  20. function init_ui(w) {
  21. w.signal.hide.connect(Gtk.main_quit);
  22. w.set_default_size(360, 100);
  23. w.set_title("Colors");
  24. w.set_position(Gtk.WindowPosition.CENTER);
  25. var darea = new Gtk.DrawingArea();
  26. darea.signal.expose_event.connect(on_expose);
  27. w.add(darea);
  28. w.show_all();
  29. }
  30. function on_expose(darea) {
  31. print(darea);
  32. var cr = new cairo.Context.from_drawable(darea.window);
  33. draw_colors(cr);
  34. }
  35. function draw_colors(cr) {
  36. cr.set_source_rgb(0.2, 0.23, 0.9);
  37. cr.rectangle(10, 15, 90, 60);
  38. cr.fill();
  39. cr.set_source_rgb(0.9, 0.1, 0.1);
  40. cr.rectangle(130, 15, 90, 60);
  41. cr.fill();
  42. cr.set_source_rgb(0.4, 0.9, 0.4);
  43. cr.rectangle(250, 15, 90, 60);
  44. cr.fill();
  45. }
  46. }
  47. });
  48. var window = new Example();
  49. Gtk.main();

在我们的示例中,我们将绘制三个矩形,并用三种不同的颜色填充它们。

  1. var darea = new Gtk.DrawingArea();

我们将在DrawingArea小部件上进行绘制操作。

  1. darea.signal.expose_event.connect(on_expose);

当需要重绘窗口时,将触发expose_event。 为响应此事件,我们调用on_expose()方法。

  1. var cr = new cairo.Context.from_drawable(darea.window);

我们从绘图区域的GdkWindow创建 cairo 上下文对象。 上下文是我们绘制所有图纸的对象。

  1. draw_colors(cr);

实际图形委托给draw_colors()方法。

  1. cr.set_source_rgb(0.2, 0.23, 0.9);

set_source_rgb()方法为 Cario 上下文设置颜色。 该方法的三个参数是颜色强度值。

  1. cr.rectangle(10, 15, 90, 60);

我们画一个矩形。 前两个参数是矩形左上角的 x,y 坐标。 最后两个参数是矩形的宽度和高度。

  1. cr.fill();

我们用当前颜色填充矩形的内部。

JavaScript GTK 中的 Cario 绘图 - 图1

图:颜色

基本形状

下一个示例将一些基本形状绘制到窗口上。

  1. #!/usr/bin/seed
  2. /*
  3. ZetCode JavaScript GTK tutorial
  4. This code example draws basic shapes
  5. with the Cairo library
  6. author: Jan Bodnar
  7. website: www.zetcode.com
  8. last modified: July 2011
  9. */
  10. Gtk = imports.gi.Gtk;
  11. cairo = imports.cairo;
  12. Gtk.init(null, null);
  13. Example = new GType({
  14. parent: Gtk.Window.type,
  15. name: "Example",
  16. init: function ()
  17. {
  18. init_ui(this);
  19. function init_ui(w) {
  20. w.signal.hide.connect(Gtk.main_quit);
  21. w.set_default_size(390, 240);
  22. w.set_title("Basic shapes");
  23. w.set_position(Gtk.WindowPosition.CENTER);
  24. var darea = new Gtk.DrawingArea();
  25. darea.signal.expose_event.connect(on_expose);
  26. w.add(darea);
  27. w.show_all();
  28. }
  29. function on_expose(darea) {
  30. var cr = new cairo.Context.from_drawable(darea.window);
  31. draw_colors(cr);
  32. }
  33. function draw_colors(cr) {
  34. cr.set_source_rgb(0.6, 0.6, 0.6);
  35. cr.rectangle(20, 20, 120, 80);
  36. cr.rectangle(180, 20, 80, 80);
  37. cr.fill();
  38. cr.arc(330, 60, 40, 0, 2*Math.PI);
  39. cr.fill();
  40. cr.arc(90, 160, 40, Math.PI/4, Math.PI);
  41. cr.fill();
  42. cr.translate(220, 180);
  43. cr.scale(1, 0.7);
  44. cr.arc(0, 0, 50, 0, 2*Math.PI);
  45. cr.fill();
  46. }
  47. }
  48. });
  49. var window = new Example();
  50. Gtk.main();

在此示例中,我们将创建一个矩形,一个正方形,一个圆形,一个弧形和一个椭圆形。 我们用蓝色绘制轮廓,内部用白色绘制。

  1. cr.rectangle(20, 20, 120, 80);
  2. cr.rectangle(180, 20, 80, 80);
  3. cr.fill();

这些线绘制一个矩形和一个正方形。

  1. cr.arc(330, 60, 40, 0, 2*Math.PI);
  2. cr.fill();

此处arc()方法绘制一个完整的圆。

  1. cr.translate(220, 180);
  2. cr.scale(1, 0.7);
  3. cr.arc(0, 0, 50, 0, 2*Math.PI);
  4. cr.fill();

translate()方法将对象移动到特定点。 如果要绘制椭圆形,请先进行一些缩放。 在这里scale()方法缩小 y 轴。

JavaScript GTK 中的 Cario 绘图 - 图2

图:基本形状

透明矩形

透明性是指能够透视材料的质量。 了解透明度的最简单方法是想象一块玻璃或水。 从技术上讲,光线可以穿过玻璃,这样我们就可以看到玻璃后面的物体。

在计算机图形学中,我们可以使用 alpha 合成来实现透明效果。 Alpha 合成是将图像与背景组合以创建部分透明外观的过程。 合成过程使用 Alpha 通道。 (wikipedia.org,answers.com)

  1. #!/usr/bin/seed
  2. /*
  3. ZetCode JavaScript GTK tutorial
  4. This program shows transparent
  5. rectangles using Cairo
  6. author: Jan Bodnar
  7. website: www.zetcode.com
  8. last modified: July 2011
  9. */
  10. Gtk = imports.gi.Gtk;
  11. cairo = imports.cairo;
  12. Gtk.init(null, null);
  13. Example = new GType({
  14. parent: Gtk.Window.type,
  15. name: "Example",
  16. init: function ()
  17. {
  18. init_ui(this);
  19. function init_ui(w) {
  20. w.signal.hide.connect(Gtk.main_quit);
  21. w.set_default_size(590, 90);
  22. w.set_title("Transparent rectangles");
  23. w.set_position(Gtk.WindowPosition.CENTER);
  24. var darea = new Gtk.DrawingArea();
  25. darea.signal.expose_event.connect(on_expose);
  26. w.add(darea);
  27. w.show_all();
  28. }
  29. function on_expose(darea) {
  30. var cr = new cairo.Context.from_drawable(darea.window);
  31. draw_rectangles(cr);
  32. }
  33. function draw_rectangles(cr) {
  34. for (var i=1; i<=10; i++) {
  35. cr.set_source_rgba(0, 0, 1, i*0.1);
  36. cr.rectangle(50*i, 20, 40, 40);
  37. cr.fill();
  38. }
  39. }
  40. }
  41. });
  42. var window = new Example();
  43. Gtk.main();

在示例中,我们将绘制十个具有不同透明度级别的矩形。

  1. cr.set_source_rgba(0, 0, 1, i*0.1);

set_source_rgba()方法的最后一个参数是 alpha 透明度。

JavaScript GTK 中的 Cario 绘图 - 图3

图:透明矩形

在 JavaScript GTK 教程的这一章中,我们使用 Cairo 库进行绘图。