cairo 1.8.5 → 1.10.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of cairo might be problematic. Click here for more details.

Files changed (106) hide show
  1. data/NEWS +2 -2
  2. data/Rakefile +44 -7
  3. data/ext/cairo/cairo.def +28 -1
  4. data/ext/cairo/extconf.rb +14 -16
  5. data/ext/cairo/rb_cairo.c +4 -1
  6. data/ext/cairo/rb_cairo.h +65 -1
  7. data/ext/cairo/rb_cairo_constants.c +150 -3
  8. data/ext/cairo/rb_cairo_context.c +17 -0
  9. data/ext/cairo/rb_cairo_device.c +406 -0
  10. data/ext/cairo/rb_cairo_exception.c +83 -32
  11. data/ext/cairo/rb_cairo_io.c +166 -0
  12. data/ext/cairo/rb_cairo_io.h +44 -0
  13. data/ext/cairo/rb_cairo_matrix.c +1 -1
  14. data/ext/cairo/rb_cairo_private.h +3 -0
  15. data/ext/cairo/rb_cairo_region.c +385 -0
  16. data/ext/cairo/rb_cairo_surface.c +674 -199
  17. data/samples/blur.rb +2 -3
  18. data/samples/{pac2.rb → pac-nomralize.rb} +5 -6
  19. data/samples/pac-tee.rb +170 -0
  20. data/samples/pac.rb +2 -3
  21. data/samples/png.rb +2 -3
  22. data/samples/scalable.rb +2 -3
  23. data/samples/text-on-path.rb +2 -3
  24. data/samples/text2.rb +2 -3
  25. data/test/cairo-test-utils.rb +15 -0
  26. data/test/run-test.rb +5 -4
  27. data/test/test_context.rb +4 -4
  28. data/test/test_font_face.rb +34 -21
  29. data/test/test_recording_surface.rb +18 -0
  30. data/test/test_region.rb +102 -0
  31. data/test/test_script_device.rb +46 -0
  32. data/test/test_script_surface.rb +13 -0
  33. data/test/test_surface.rb +14 -4
  34. data/test/test_tee_surface.rb +32 -0
  35. data/test/test_xml_device.rb +22 -0
  36. data/test/test_xml_surface.rb +32 -0
  37. metadata +49 -77
  38. data/pkg-config.rb +0 -313
  39. data/test-unit/Rakefile +0 -30
  40. data/test-unit/bin/testrb +0 -5
  41. data/test-unit/lib/test/unit.rb +0 -280
  42. data/test-unit/lib/test/unit/assertionfailederror.rb +0 -14
  43. data/test-unit/lib/test/unit/assertions.rb +0 -722
  44. data/test-unit/lib/test/unit/attribute.rb +0 -125
  45. data/test-unit/lib/test/unit/autorunner.rb +0 -254
  46. data/test-unit/lib/test/unit/collector.rb +0 -43
  47. data/test-unit/lib/test/unit/collector/descendant.rb +0 -23
  48. data/test-unit/lib/test/unit/collector/dir.rb +0 -108
  49. data/test-unit/lib/test/unit/collector/load.rb +0 -135
  50. data/test-unit/lib/test/unit/collector/objectspace.rb +0 -34
  51. data/test-unit/lib/test/unit/color.rb +0 -61
  52. data/test-unit/lib/test/unit/diff.rb +0 -524
  53. data/test-unit/lib/test/unit/error.rb +0 -124
  54. data/test-unit/lib/test/unit/exceptionhandler.rb +0 -39
  55. data/test-unit/lib/test/unit/failure.rb +0 -110
  56. data/test-unit/lib/test/unit/fixture.rb +0 -185
  57. data/test-unit/lib/test/unit/notification.rb +0 -125
  58. data/test-unit/lib/test/unit/omission.rb +0 -143
  59. data/test-unit/lib/test/unit/pending.rb +0 -146
  60. data/test-unit/lib/test/unit/priority.rb +0 -146
  61. data/test-unit/lib/test/unit/runner/console.rb +0 -46
  62. data/test-unit/lib/test/unit/runner/emacs.rb +0 -8
  63. data/test-unit/lib/test/unit/testcase.rb +0 -281
  64. data/test-unit/lib/test/unit/testresult.rb +0 -89
  65. data/test-unit/lib/test/unit/testsuite.rb +0 -110
  66. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +0 -14
  67. data/test-unit/lib/test/unit/ui/console/testrunner.rb +0 -195
  68. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +0 -49
  69. data/test-unit/lib/test/unit/ui/testrunner.rb +0 -20
  70. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +0 -77
  71. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +0 -41
  72. data/test-unit/lib/test/unit/util/backtracefilter.rb +0 -41
  73. data/test-unit/lib/test/unit/util/observable.rb +0 -90
  74. data/test-unit/lib/test/unit/util/procwrapper.rb +0 -48
  75. data/test-unit/lib/test/unit/version.rb +0 -7
  76. data/test-unit/sample/adder.rb +0 -13
  77. data/test-unit/sample/subtracter.rb +0 -12
  78. data/test-unit/sample/tc_adder.rb +0 -18
  79. data/test-unit/sample/tc_subtracter.rb +0 -18
  80. data/test-unit/sample/ts_examples.rb +0 -7
  81. data/test-unit/test/collector/test_descendant.rb +0 -135
  82. data/test-unit/test/collector/test_dir.rb +0 -406
  83. data/test-unit/test/collector/test_load.rb +0 -333
  84. data/test-unit/test/collector/test_objectspace.rb +0 -98
  85. data/test-unit/test/run-test.rb +0 -13
  86. data/test-unit/test/test_assertions.rb +0 -693
  87. data/test-unit/test/test_attribute.rb +0 -86
  88. data/test-unit/test/test_color.rb +0 -37
  89. data/test-unit/test/test_diff.rb +0 -477
  90. data/test-unit/test/test_emacs_runner.rb +0 -60
  91. data/test-unit/test/test_error.rb +0 -26
  92. data/test-unit/test/test_failure.rb +0 -33
  93. data/test-unit/test/test_fixture.rb +0 -252
  94. data/test-unit/test/test_notification.rb +0 -33
  95. data/test-unit/test/test_omission.rb +0 -81
  96. data/test-unit/test/test_pending.rb +0 -70
  97. data/test-unit/test/test_priority.rb +0 -89
  98. data/test-unit/test/test_testcase.rb +0 -430
  99. data/test-unit/test/test_testresult.rb +0 -113
  100. data/test-unit/test/test_testsuite.rb +0 -129
  101. data/test-unit/test/testunit_test_util.rb +0 -14
  102. data/test-unit/test/ui/test_testrunmediator.rb +0 -20
  103. data/test-unit/test/util/test_backtracefilter.rb +0 -41
  104. data/test-unit/test/util/test_observable.rb +0 -102
  105. data/test-unit/test/util/test_procwrapper.rb +0 -36
  106. data/test/test_pkg_config.rb +0 -123
@@ -1,9 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  top = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
- src = File.join(top, "src")
5
- $LOAD_PATH.unshift src
6
- $LOAD_PATH.unshift File.join(src, "lib")
4
+ $LOAD_PATH.unshift File.join(top, "ext", "cairo")
5
+ $LOAD_PATH.unshift File.join(top, "lib")
7
6
 
8
7
  require 'cairo'
9
8
 
@@ -1,13 +1,12 @@
1
1
  =begin
2
- pac2.rb - rcairo sample script with #scale and #translate.
2
+ pac-normalize.rb - rcairo sample script with #scale and #translate.
3
3
 
4
4
  Original: pac.rb in http://www.artima.com/rubycs/articles/pdf_writer3.html
5
5
  =end
6
6
 
7
7
  top = File.expand_path(File.join(File.dirname(__FILE__), ".."))
8
- src = File.join(top, "src")
9
- $LOAD_PATH.unshift src
10
- $LOAD_PATH.unshift File.join(src, "lib")
8
+ $LOAD_PATH.unshift File.join(top, "ext", "cairo")
9
+ $LOAD_PATH.unshift File.join(top, "lib")
11
10
 
12
11
  require "cairo"
13
12
 
@@ -152,13 +151,13 @@ paper = Cairo::Paper.parse(:a4_landscape)
152
151
  size_in_points = paper.size("pt")
153
152
  Cairo::ImageSurface.new(*size_in_points) do |surface|
154
153
  cr = pac(surface, *size_in_points)
155
- cr.target.write_to_png("pac2.png")
154
+ cr.target.write_to_png("pac-normalize.png")
156
155
  end
157
156
 
158
157
  scalable_surface_output = Proc.new do |surface_class_name, suffix|
159
158
  if Cairo.const_defined?(surface_class_name)
160
159
  surface_class = Cairo.const_get(surface_class_name)
161
- surface_class.new("pac2.#{suffix}", paper) do |surface|
160
+ surface_class.new("pac-normalize.#{suffix}", paper) do |surface|
162
161
  pac(surface, *size_in_points)
163
162
  end
164
163
  else
@@ -0,0 +1,170 @@
1
+ =begin
2
+ pac-tee.rb - rcairo sample script with TeeSurface.
3
+
4
+ Original: pac.rb in http://www.artima.com/rubycs/articles/pdf_writer3.html
5
+ =end
6
+
7
+ top = File.expand_path(File.join(File.dirname(__FILE__), ".."))
8
+ $LOAD_PATH.unshift File.join(top, "ext", "cairo")
9
+ $LOAD_PATH.unshift File.join(top, "lib")
10
+
11
+ require "cairo"
12
+
13
+ def pac(surface, width, height)
14
+ cr = Cairo::Context.new(surface)
15
+
16
+ # NOTE: You may need to set line width when use Cairo::Context#scale
17
+ cr.set_line_width(cr.line_width / [width, height].max)
18
+
19
+ cr.scale(width, height)
20
+
21
+ cr.save do
22
+ cr.set_source_color(:black)
23
+ cr.rectangle(0, 0, 1, 1)
24
+ cr.fill
25
+ end
26
+
27
+ # Wall
28
+ wall_width = 0.89
29
+ wall_height = 0.03
30
+ wall_space = 0.5
31
+ wall_x = 0.02
32
+ wall1_y = 1 - 0.86
33
+ wall2_y = wall1_y + wall_space
34
+ wall_radius = 0.01
35
+
36
+ cr.set_source_color(:magenta)
37
+ cr.rounded_rectangle(wall_x, wall1_y, wall_width, wall_height, wall_radius)
38
+ cr.fill
39
+ cr.set_source_color(:cyan)
40
+ cr.rounded_rectangle(wall_x, wall1_y, wall_width, wall_height, wall_radius)
41
+ cr.stroke
42
+
43
+ cr.set_source_color(:magenta)
44
+ cr.rounded_rectangle(wall_x, wall2_y, wall_width, wall_height, wall_radius)
45
+ cr.fill
46
+ cr.set_source_color(:cyan)
47
+ cr.rounded_rectangle(wall_x, wall2_y, wall_width, wall_height, wall_radius)
48
+ cr.stroke
49
+
50
+ # Body
51
+ body_x = 0.17
52
+ body_y = 1 - 0.58
53
+ body_width = 0.23
54
+ body_height = 0.33
55
+
56
+ cr.save do
57
+ cr.translate(body_x, body_y)
58
+ cr.set_source_color(:yellow)
59
+ cr.scale(body_width, body_height)
60
+ cr.arc(0, 0, 0.5, 30 * (Math::PI / 180), 330 * (Math::PI / 180))
61
+ cr.line_to(0, 0)
62
+ cr.close_path
63
+ cr.fill
64
+ end
65
+
66
+ # Dot
67
+ dot_width = 0.02
68
+ dot_height = 0.03
69
+ small_dot_width = 0.01
70
+ small_dot_height = 0.015
71
+ dot_x = 0.29
72
+ dot_y = 1 - 0.58
73
+ dot_step = 0.05
74
+
75
+ cr.save do
76
+ cr.set_source_color(:yellow)
77
+ cr.save do
78
+ cr.translate(dot_x, dot_y)
79
+ cr.scale(dot_width, dot_height)
80
+ cr.circle(0, 0, 1).fill
81
+ end
82
+
83
+ 4.times do |i|
84
+ cr.save do
85
+ cr.translate(dot_x + dot_step * (i + 1), dot_y)
86
+ cr.scale(small_dot_width, small_dot_height)
87
+ cr.circle(0, 0, 1).fill
88
+ end
89
+ end
90
+ end
91
+
92
+ # Ghost
93
+ ghost_x = 0.59
94
+ ghost_x_step = 0.03
95
+ ghost_y = 1 - 0.42
96
+ ghost_y_step = 0.04
97
+ ghost_width = 0.18
98
+ ghost_height = 0.29
99
+ ghost_radius= 0.08
100
+ cr.move_to(ghost_x, ghost_y)
101
+ cr.line_to(ghost_x, ghost_y - ghost_height)
102
+ cr.curve_to(ghost_x + ghost_width / 3.0,
103
+ ghost_y - ghost_height - ghost_radius,
104
+ ghost_x + ghost_width * (2.0 / 3.0),
105
+ ghost_y - ghost_height - ghost_radius,
106
+ ghost_x + ghost_width,
107
+ ghost_y - ghost_height)
108
+ cr.line_to(ghost_x + ghost_width, ghost_y)
109
+ i = 0
110
+ (ghost_x + ghost_width).step(ghost_x, -ghost_x_step) do |x|
111
+ cr.line_to(x, ghost_y + -ghost_y_step * (i % 2))
112
+ i += 1
113
+ end
114
+ cr.close_path
115
+
116
+ cr.set_source_color(:blue)
117
+ cr.fill_preserve
118
+ cr.set_source_color(:cyan)
119
+ cr.stroke
120
+
121
+ # Ghost Eyes
122
+ eye_x = 0.62
123
+ eye_y = 1 - 0.63
124
+ eye_space = 0.06
125
+ white_eye_width = 0.03
126
+ white_eye_height = 0.04
127
+ black_eye_width = 0.01
128
+ black_eye_height = 0.02
129
+
130
+ cr.set_source_color(:white)
131
+ cr.rectangle(eye_x, eye_y - white_eye_height,
132
+ white_eye_width, white_eye_height)
133
+ cr.fill
134
+ cr.rectangle(eye_x + eye_space, eye_y - white_eye_height,
135
+ white_eye_width, white_eye_height)
136
+ cr.fill
137
+
138
+ cr.set_source_color(:black)
139
+ cr.rectangle(eye_x, eye_y - black_eye_height,
140
+ black_eye_width, black_eye_height)
141
+ cr.fill
142
+ cr.rectangle(eye_x + eye_space, eye_y - black_eye_height,
143
+ black_eye_width, black_eye_height)
144
+ cr.fill
145
+
146
+ cr.show_page
147
+ end
148
+
149
+ paper = Cairo::Paper.parse(:a4_landscape)
150
+
151
+ size_in_points = paper.size("pt")
152
+ image_surface = Cairo::ImageSurface.new(*size_in_points)
153
+
154
+ tee_surface = Cairo::TeeSurface.new(image_surface)
155
+
156
+ add_scalable_surface = Proc.new do |surface_class_name, suffix|
157
+ if Cairo.const_defined?(surface_class_name)
158
+ surface_class = Cairo.const_get(surface_class_name)
159
+ tee_surface << surface_class.new("pac-tee.#{suffix}", paper)
160
+ else
161
+ puts("#{surface_class_name} isn't supported.")
162
+ end
163
+ end
164
+
165
+ add_scalable_surface.call("PSSurface", "ps")
166
+ add_scalable_surface.call("PDFSurface", "pdf")
167
+ add_scalable_surface.call("SVGSurface", "svg")
168
+
169
+ pac(tee_surface, *size_in_points)
170
+ image_surface.write_to_png("pac-tee.png")
@@ -5,9 +5,8 @@
5
5
  =end
6
6
 
7
7
  top = File.expand_path(File.join(File.dirname(__FILE__), ".."))
8
- src = File.join(top, "src")
9
- $LOAD_PATH.unshift src
10
- $LOAD_PATH.unshift File.join(src, "lib")
8
+ $LOAD_PATH.unshift File.join(top, "ext", "cairo")
9
+ $LOAD_PATH.unshift File.join(top, "lib")
11
10
 
12
11
  require "cairo"
13
12
 
@@ -1,9 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  top = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
- src = File.join(top, "src")
5
- $LOAD_PATH.unshift src
6
- $LOAD_PATH.unshift File.join(src, "lib")
4
+ $LOAD_PATH.unshift File.join(top, "ext", "cairo")
5
+ $LOAD_PATH.unshift File.join(top, "lib")
7
6
 
8
7
  require 'cairo'
9
8
 
@@ -1,9 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  top = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
- src = File.join(top, "src")
5
- $LOAD_PATH.unshift src
6
- $LOAD_PATH.unshift File.join(src, "lib")
4
+ $LOAD_PATH.unshift File.join(top, "ext", "cairo")
5
+ $LOAD_PATH.unshift File.join(top, "lib")
7
6
 
8
7
  require 'cairo'
9
8
  require 'stringio'
@@ -1,9 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  top = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
- src = File.join(top, "src")
5
- $LOAD_PATH.unshift src
6
- $LOAD_PATH.unshift File.join(src, "lib")
4
+ $LOAD_PATH.unshift File.join(top, "ext", "cairo")
5
+ $LOAD_PATH.unshift File.join(top, "lib")
7
6
 
8
7
  require 'cairo'
9
8
  require 'pango'
@@ -1,9 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  top = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
- src = File.join(top, "src")
5
- $LOAD_PATH.unshift src
6
- $LOAD_PATH.unshift File.join(src, "lib")
4
+ $LOAD_PATH.unshift File.join(top, "ext", "cairo")
5
+ $LOAD_PATH.unshift File.join(top, "lib")
7
6
 
8
7
  require 'optparse'
9
8
  require 'ostruct'
@@ -1,4 +1,5 @@
1
1
  require 'cairo'
2
+ require 'stringio'
2
3
 
3
4
  module CairoTestUtils
4
5
  private
@@ -15,4 +16,18 @@ module CairoTestUtils
15
16
  def win32?
16
17
  /cygwin|mingw|mswin32|bccwin32/.match(RUBY_PLATFORM) ? true : false
17
18
  end
19
+
20
+ def only_device(name)
21
+ device_class = "#{name}Device"
22
+ unless Cairo.const_defined?(device_class)
23
+ omit("Only for #{device_class} device available")
24
+ end
25
+ end
26
+
27
+ def only_surface(name)
28
+ surface_class = "#{name}Surface"
29
+ unless Cairo.const_defined?(surface_class)
30
+ omit("Only for #{surface_class} surface available")
31
+ end
32
+ end
18
33
  end
@@ -1,17 +1,18 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  base_dir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
- test_unit_dir = File.join(base_dir, "test-unit", "lib")
5
4
  ext_dir = File.join(base_dir, "ext", "cairo")
6
5
  lib_dir = File.join(base_dir, "lib")
7
6
  test_dir = File.join(base_dir, "test")
8
7
 
9
8
  if system("which make > /dev/null")
10
- system("cd #{base_dir.dump} && make > /dev/null") or exit(1)
9
+ Dir.chdir(base_dir) do
10
+ system("make > /dev/null") or exit(1)
11
+ end
11
12
  end
12
13
 
13
- $LOAD_PATH.unshift(test_unit_dir)
14
-
14
+ require 'rubygems'
15
+ gem 'test-unit'
15
16
  require 'test/unit'
16
17
 
17
18
  $LOAD_PATH.unshift(base_dir)
@@ -12,17 +12,17 @@ class ContextTest < Test::Unit::TestCase
12
12
  def test_new_and_destroy
13
13
  context = Cairo::Context.new(@surface)
14
14
  @surface.destroy
15
- assert_no_match(/%%EOF\s*\z/m, @output.string)
15
+ assert_not_equal("%%EOF\n", @output.string[-6..-1])
16
16
  context.destroy
17
- assert_match(/%%EOF\s*\z/m, @output.string)
17
+ assert_equal("%%EOF\n", @output.string[-6..-1])
18
18
  end
19
19
 
20
20
  def test_new_with_block
21
21
  Cairo::Context.new(@surface) do |context|
22
22
  @surface.destroy
23
- assert_no_match(/%%EOF\s*\z/m, @output.string)
23
+ assert_not_equal("%%EOF\n", @output.string[-6..-1])
24
24
  end
25
- assert_match(/%%EOF\s*\z/m, @output.string)
25
+ assert_equal("%%EOF\n", @output.string[-6..-1])
26
26
  end
27
27
 
28
28
  def test_new_with_block_and_destroy
@@ -93,15 +93,18 @@ class FontFaceTest < Test::Unit::TestCase
93
93
  Cairo::FontOptions.new)
94
94
  result = scaled_font.text_to_glyphs(0, 0, "text")
95
95
  assert_equal([[[Cairo::ScaledFont, Cairo::Context, Cairo::FontExtents]],
96
- [[Cairo::ScaledFont, ?t, Cairo::Context, Cairo::TextExtents],
97
- [Cairo::ScaledFont, ?e, Cairo::Context, Cairo::TextExtents],
98
- [Cairo::ScaledFont, ?x, Cairo::Context, Cairo::TextExtents]],
96
+ [[Cairo::ScaledFont, codepoint("t"),
97
+ Cairo::Context, Cairo::TextExtents],
98
+ [Cairo::ScaledFont, codepoint("e"),
99
+ Cairo::Context, Cairo::TextExtents],
100
+ [Cairo::ScaledFont, codepoint("x"),
101
+ Cairo::Context, Cairo::TextExtents]],
99
102
  [[Cairo::ScaledFont, "text",
100
103
  Cairo::UserFontFace::TextToGlyphsData]],
101
- [[Cairo::ScaledFont, ?t],
102
- [Cairo::ScaledFont, ?e],
103
- [Cairo::ScaledFont, ?x],
104
- [Cairo::ScaledFont, ?t]],
104
+ [[Cairo::ScaledFont, codepoint("t")],
105
+ [Cairo::ScaledFont, codepoint("e")],
106
+ [Cairo::ScaledFont, codepoint("x")],
107
+ [Cairo::ScaledFont, codepoint("t")]],
105
108
  [[], [], Cairo::TextClusterFlag::BACKWARD]],
106
109
  [classify_cairo_object(init_args),
107
110
  classify_cairo_object(render_glyph_args),
@@ -155,15 +158,18 @@ class FontFaceTest < Test::Unit::TestCase
155
158
  Cairo::FontOptions.new)
156
159
  result = scaled_font.text_to_glyphs(0, 0, "text")
157
160
  assert_equal([[[Cairo::ScaledFont, Cairo::Context, Cairo::FontExtents]],
158
- [[Cairo::ScaledFont, ?t, Cairo::Context, Cairo::TextExtents],
159
- [Cairo::ScaledFont, ?e, Cairo::Context, Cairo::TextExtents],
160
- [Cairo::ScaledFont, ?x, Cairo::Context, Cairo::TextExtents]],
161
+ [[Cairo::ScaledFont, codepoint("t"),
162
+ Cairo::Context, Cairo::TextExtents],
163
+ [Cairo::ScaledFont, codepoint("e"),
164
+ Cairo::Context, Cairo::TextExtents],
165
+ [Cairo::ScaledFont, codepoint("x"),
166
+ Cairo::Context, Cairo::TextExtents]],
161
167
  [[Cairo::ScaledFont, "text",
162
168
  Cairo::UserFontFace::TextToGlyphsData]],
163
- [[Cairo::ScaledFont, ?t],
164
- [Cairo::ScaledFont, ?e],
165
- [Cairo::ScaledFont, ?x],
166
- [Cairo::ScaledFont, ?t]],
169
+ [[Cairo::ScaledFont, codepoint("t")],
170
+ [Cairo::ScaledFont, codepoint("e")],
171
+ [Cairo::ScaledFont, codepoint("x")],
172
+ [Cairo::ScaledFont, codepoint("t")]],
167
173
  [[], [], Cairo::TextClusterFlag::BACKWARD]],
168
174
  [classify_cairo_object(face.init_args),
169
175
  classify_cairo_object(face.render_glyph_args),
@@ -207,15 +213,18 @@ class FontFaceTest < Test::Unit::TestCase
207
213
  Cairo::FontOptions.new)
208
214
  result = scaled_font.text_to_glyphs(0, 0, "text")
209
215
  assert_equal([[[Cairo::ScaledFont, Cairo::Context, Cairo::FontExtents]],
210
- [[Cairo::ScaledFont, ?t, Cairo::Context, Cairo::TextExtents],
211
- [Cairo::ScaledFont, ?e, Cairo::Context, Cairo::TextExtents],
212
- [Cairo::ScaledFont, ?x, Cairo::Context, Cairo::TextExtents]],
216
+ [[Cairo::ScaledFont, codepoint("t"),
217
+ Cairo::Context, Cairo::TextExtents],
218
+ [Cairo::ScaledFont, codepoint("e"),
219
+ Cairo::Context, Cairo::TextExtents],
220
+ [Cairo::ScaledFont, codepoint("x"),
221
+ Cairo::Context, Cairo::TextExtents]],
213
222
  [[Cairo::ScaledFont, "text",
214
223
  Cairo::UserFontFace::TextToGlyphsData]],
215
- [[Cairo::ScaledFont, ?t],
216
- [Cairo::ScaledFont, ?e],
217
- [Cairo::ScaledFont, ?x],
218
- [Cairo::ScaledFont, ?t]],
224
+ [[Cairo::ScaledFont, codepoint("t")],
225
+ [Cairo::ScaledFont, codepoint("e")],
226
+ [Cairo::ScaledFont, codepoint("x")],
227
+ [Cairo::ScaledFont, codepoint("t")]],
219
228
  [],
220
229
  [],
221
230
  [],
@@ -241,4 +250,8 @@ class FontFaceTest < Test::Unit::TestCase
241
250
  object
242
251
  end
243
252
  end
253
+
254
+ def codepoint(character)
255
+ character.unpack("U")[0]
256
+ end
244
257
  end
@@ -0,0 +1,18 @@
1
+ class RecordingSurfaceTest < Test::Unit::TestCase
2
+ include CairoTestUtils
3
+
4
+ def setup
5
+ only_surface("Recording")
6
+ end
7
+
8
+ def test_new
9
+ surface = Cairo::RecordingSurface.new(10, 20, 300, 400)
10
+ assert_equal([0.0, 0.0, 0.0, 0.0], surface.ink_extents)
11
+ Cairo::Context.new(surface) do |context|
12
+ context.move_to(15, 30)
13
+ context.line_to(80, 100)
14
+ context.stroke
15
+ end
16
+ assert_equal([10.0, 20.0, 99.0, 109.0], surface.ink_extents)
17
+ end
18
+ end