cairo 1.6.1-x86-mswin32 → 1.7.0-x86-mswin32

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 (410) hide show
  1. data/ChangeLog +285 -0
  2. data/NEWS +33 -0
  3. data/README +15 -4
  4. data/Rakefile +3 -0
  5. data/cairo/bin/libcairo-2.dll +0 -0
  6. data/cairo/bin/libpng12-0.dll +0 -0
  7. data/cairo/include/{libpng13/png.h → png.h} +285 -135
  8. data/cairo/include/{libpng13/pngconf.h → pngconf.h} +116 -72
  9. data/cairo/lib/cairo.lib +0 -0
  10. data/cairo/lib/libcairo.dll.a +0 -0
  11. data/cairo/lib/libpng.def +361 -371
  12. data/cairo/lib/libpng.lib +0 -0
  13. data/cairo/lib/libpng12.dll.a +0 -0
  14. data/cairo/lib/pkgconfig/cairo-pdf.pc +1 -1
  15. data/cairo/lib/pkgconfig/cairo-png.pc +2 -2
  16. data/cairo/lib/pkgconfig/cairo-ps.pc +1 -1
  17. data/cairo/lib/pkgconfig/cairo-svg.pc +1 -1
  18. data/cairo/lib/pkgconfig/cairo-win32-font.pc +1 -1
  19. data/cairo/lib/pkgconfig/cairo-win32.pc +1 -1
  20. data/cairo/lib/pkgconfig/cairo.pc +2 -2
  21. data/cairo/lib/pkgconfig/libpng.pc +10 -14
  22. data/cairo/lib/pkgconfig/libpng12.pc +10 -0
  23. data/cairo/make/{cairo-1.6.4-1.sh → cairo-1.6.4-2.sh} +3 -3
  24. data/cairo/make/libpng-1.2.29.sh +35 -0
  25. data/cairo/manifest/cairo-1.6.4-2.mft +6 -0
  26. data/cairo/manifest/{cairo-dev-1.6.4-1.mft → cairo-dev-1.6.4-2.mft} +2 -2
  27. data/cairo/manifest/libpng-1.2.29.mft +2 -0
  28. data/cairo/manifest/libpng-dev-1.2.29.mft +12 -0
  29. data/cairo/share/doc/{cairo-1.6.4-1 → cairo-1.6.4-2}/COPYING +0 -0
  30. data/cairo/share/doc/{cairo-1.6.4-1 → cairo-1.6.4-2}/COPYING-LGPL-2.1 +0 -0
  31. data/cairo/share/doc/{cairo-1.6.4-1 → cairo-1.6.4-2}/COPYING-MPL-1.1 +0 -0
  32. data/cairo/share/man/man3/libpng.3 +3680 -0
  33. data/cairo/share/man/man3/libpngpf.3 +274 -0
  34. data/cairo/share/man/man5/png.5 +74 -0
  35. data/doc/en/cairo-antialias.html +0 -3
  36. data/doc/en/cairo-clip-not-representable-error.html +0 -3
  37. data/doc/en/cairo-color-base.html +0 -3
  38. data/doc/en/cairo-color-cmyk.html +0 -3
  39. data/doc/en/cairo-color-hsv.html +0 -3
  40. data/doc/en/cairo-color-rgb.html +0 -3
  41. data/doc/en/cairo-color-x11.html +0 -3
  42. data/doc/en/cairo-color.html +0 -3
  43. data/doc/en/cairo-content.html +0 -3
  44. data/doc/en/cairo-context-blur.html +0 -3
  45. data/doc/en/cairo-context-circle.html +0 -3
  46. data/doc/en/cairo-context-color.html +0 -3
  47. data/doc/en/cairo-context-path.html +0 -3
  48. data/doc/en/cairo-context-rectangle.html +0 -3
  49. data/doc/en/cairo-context-triangle.html +0 -3
  50. data/doc/en/cairo-context.html +119 -102
  51. data/doc/en/cairo-error.html +0 -3
  52. data/doc/en/cairo-extend.html +0 -3
  53. data/doc/en/cairo-file-not-found.html +0 -3
  54. data/doc/en/cairo-fill-rule.html +0 -3
  55. data/doc/en/cairo-filter.html +0 -3
  56. data/doc/en/cairo-font-extents.html +67 -12
  57. data/doc/en/cairo-font-face.html +0 -3
  58. data/doc/en/cairo-font-options.html +26 -14
  59. data/doc/en/cairo-font-slant.html +0 -3
  60. data/doc/en/cairo-font-type-mismatch.html +47 -0
  61. data/doc/en/cairo-font-weight.html +0 -3
  62. data/doc/en/cairo-format.html +0 -3
  63. data/doc/en/cairo-glyph.html +0 -3
  64. data/doc/en/cairo-gradient-pattern.html +0 -3
  65. data/doc/en/cairo-hint-metrics.html +0 -3
  66. data/doc/en/cairo-hint-style.html +0 -3
  67. data/doc/en/cairo-image-surface.html +0 -3
  68. data/doc/en/cairo-invalid-clusters.html +47 -0
  69. data/doc/en/cairo-invalid-content-error.html +0 -3
  70. data/doc/en/cairo-invalid-dash-error.html +0 -3
  71. data/doc/en/cairo-invalid-dsc-comment-error.html +0 -3
  72. data/doc/en/cairo-invalid-format-error.html +0 -3
  73. data/doc/en/cairo-invalid-index-error.html +0 -3
  74. data/doc/en/cairo-invalid-matrix-error.html +0 -3
  75. data/doc/en/cairo-invalid-path-data-error.html +0 -3
  76. data/doc/en/cairo-invalid-pop-group-error.html +0 -3
  77. data/doc/en/cairo-invalid-restore-error.html +0 -3
  78. data/doc/en/cairo-invalid-slant.html +47 -0
  79. data/doc/en/cairo-invalid-status-error.html +0 -3
  80. data/doc/en/cairo-invalid-stride-error.html +0 -3
  81. data/doc/en/cairo-invalid-string-error.html +0 -3
  82. data/doc/en/cairo-invalid-visual-error.html +0 -3
  83. data/doc/en/cairo-invalid-weight.html +47 -0
  84. data/doc/en/cairo-lcd-filter.html +39 -0
  85. data/doc/en/cairo-line-cap.html +0 -3
  86. data/doc/en/cairo-line-join.html +0 -3
  87. data/doc/en/cairo-linear-pattern.html +0 -3
  88. data/doc/en/cairo-matrix.html +43 -41
  89. data/doc/en/cairo-negative-count.html +47 -0
  90. data/doc/en/cairo-no-current-point-error.html +0 -3
  91. data/doc/en/cairo-null-pointer-error.html +0 -3
  92. data/doc/en/cairo-operator.html +0 -3
  93. data/doc/en/cairo-paper-parse-error.html +0 -3
  94. data/doc/en/cairo-paper-unknown-paper-name.html +0 -3
  95. data/doc/en/cairo-paper-unknown-unit.html +0 -3
  96. data/doc/en/cairo-paper-unrecognized-paper-description.html +0 -3
  97. data/doc/en/cairo-paper.html +0 -3
  98. data/doc/en/cairo-path-close-path.html +0 -3
  99. data/doc/en/cairo-path-curve-to.html +0 -3
  100. data/doc/en/cairo-path-data-type.html +0 -3
  101. data/doc/en/cairo-path-data.html +0 -3
  102. data/doc/en/cairo-path-line-to.html +0 -3
  103. data/doc/en/cairo-path-move-to.html +0 -3
  104. data/doc/en/cairo-path.html +0 -3
  105. data/doc/en/cairo-pattern-type-mismatch-error.html +0 -3
  106. data/doc/en/cairo-pattern.html +0 -3
  107. data/doc/en/cairo-pdf-surface.html +0 -3
  108. data/doc/en/cairo-point.html +0 -3
  109. data/doc/en/cairo-ps-level.html +0 -3
  110. data/doc/en/cairo-ps-surface.html +0 -3
  111. data/doc/en/cairo-quartz-image-surface.html +0 -3
  112. data/doc/en/cairo-quartz-surface.html +0 -3
  113. data/doc/en/cairo-radial-pattern.html +0 -3
  114. data/doc/en/cairo-read-error.html +0 -3
  115. data/doc/en/cairo-rectangle.html +0 -3
  116. data/doc/en/cairo-scaled-font.html +13 -6
  117. data/doc/en/cairo-solid-pattern.html +0 -3
  118. data/doc/en/cairo-subpixel-order.html +0 -3
  119. data/doc/en/cairo-surface-finished-error.html +0 -3
  120. data/doc/en/cairo-surface-pattern.html +0 -3
  121. data/doc/en/cairo-surface-type-mismatch-error.html +0 -3
  122. data/doc/en/cairo-surface.html +22 -15
  123. data/doc/en/cairo-svg-surface.html +0 -3
  124. data/doc/en/cairo-svg-version.html +0 -3
  125. data/doc/en/cairo-temp-file-error.html +0 -3
  126. data/doc/en/cairo-text-cluster.html +84 -0
  127. data/doc/en/cairo-text-extents.html +78 -13
  128. data/doc/en/cairo-toy-font-face.html +67 -0
  129. data/doc/en/cairo-user-font-error.html +47 -0
  130. data/doc/en/cairo-user-font-face-text-to-glyphs-data.html +94 -0
  131. data/doc/en/cairo-user-font-face.html +72 -0
  132. data/doc/en/cairo-user-font-immutable.html +47 -0
  133. data/doc/en/cairo-win32-printing-surface.html +0 -3
  134. data/doc/en/cairo-win32-surface.html +0 -3
  135. data/doc/en/cairo-write-error.html +0 -3
  136. data/doc/en/cairo.html +92 -80
  137. data/doc/en/index.html +327 -240
  138. data/doc/ja/cairo-clip-not-representable-error.html +1 -1
  139. data/doc/ja/cairo-color-base.html +1 -1
  140. data/doc/ja/cairo-color-cmyk.html +9 -9
  141. data/doc/ja/cairo-color-hsv.html +8 -8
  142. data/doc/ja/cairo-color-rgb.html +9 -9
  143. data/doc/ja/cairo-color.html +8 -8
  144. data/doc/ja/cairo-context-circle.html +1 -1
  145. data/doc/ja/cairo-context-color.html +1 -1
  146. data/doc/ja/cairo-context-path.html +2 -2
  147. data/doc/ja/cairo-context.html +435 -342
  148. data/doc/ja/cairo-font-extents.html +69 -15
  149. data/doc/ja/cairo-font-face.html +3 -3
  150. data/doc/ja/cairo-font-options.html +37 -12
  151. data/doc/ja/cairo-font-slant.html +1 -1
  152. data/doc/ja/cairo-font-type-mismatch.html +52 -0
  153. data/doc/ja/cairo-glyph.html +5 -5
  154. data/doc/ja/cairo-gradient-pattern.html +6 -6
  155. data/doc/ja/cairo-image-surface.html +8 -8
  156. data/doc/ja/cairo-invalid-clusters.html +55 -0
  157. data/doc/ja/cairo-invalid-restore-error.html +1 -1
  158. data/doc/ja/cairo-invalid-slant.html +57 -0
  159. data/doc/ja/cairo-invalid-weight.html +57 -0
  160. data/doc/ja/cairo-lcd-filter.html +63 -0
  161. data/doc/ja/cairo-line-join.html +1 -1
  162. data/doc/ja/cairo-linear-pattern.html +2 -2
  163. data/doc/ja/cairo-matrix.html +35 -24
  164. data/doc/ja/cairo-negative-count.html +52 -0
  165. data/doc/ja/cairo-paper-unknown-paper-name.html +2 -2
  166. data/doc/ja/cairo-paper-unknown-unit.html +2 -2
  167. data/doc/ja/cairo-paper-unrecognized-paper-description.html +1 -1
  168. data/doc/ja/cairo-paper.html +12 -12
  169. data/doc/ja/cairo-path-close-path.html +1 -1
  170. data/doc/ja/cairo-path-curve-to.html +1 -1
  171. data/doc/ja/cairo-path-data.html +8 -8
  172. data/doc/ja/cairo-path-line-to.html +1 -1
  173. data/doc/ja/cairo-path-move-to.html +1 -1
  174. data/doc/ja/cairo-path.html +21 -21
  175. data/doc/ja/cairo-pattern.html +4 -4
  176. data/doc/ja/cairo-pdf-surface.html +2 -2
  177. data/doc/ja/cairo-point.html +5 -5
  178. data/doc/ja/cairo-ps-level.html +2 -2
  179. data/doc/ja/cairo-ps-surface.html +6 -6
  180. data/doc/ja/cairo-quartz-image-surface.html +2 -2
  181. data/doc/ja/cairo-quartz-surface.html +3 -3
  182. data/doc/ja/cairo-radial-pattern.html +2 -2
  183. data/doc/ja/cairo-rectangle.html +5 -5
  184. data/doc/ja/cairo-scaled-font.html +53 -17
  185. data/doc/ja/cairo-solid-pattern.html +3 -3
  186. data/doc/ja/cairo-surface-pattern.html +2 -2
  187. data/doc/ja/cairo-surface.html +58 -36
  188. data/doc/ja/cairo-svg-surface.html +4 -4
  189. data/doc/ja/cairo-svg-version.html +2 -2
  190. data/doc/ja/cairo-text-cluster.html +102 -0
  191. data/doc/ja/cairo-text-extents.html +84 -22
  192. data/doc/ja/cairo-toy-font-face.html +107 -0
  193. data/doc/ja/cairo-user-font-error.html +55 -0
  194. data/doc/ja/cairo-user-font-face-text-to-glyphs-data.html +155 -0
  195. data/doc/ja/cairo-user-font-face.html +268 -0
  196. data/doc/ja/cairo-user-font-immutable.html +54 -0
  197. data/doc/ja/cairo-win32-printing-surface.html +3 -3
  198. data/doc/ja/cairo-win32-surface.html +4 -4
  199. data/doc/ja/cairo.html +110 -77
  200. data/doc/ja/index.html +292 -205
  201. data/extconf.rb +3 -1
  202. data/misc/update-colors.rb +0 -0
  203. data/pkg-config.rb +54 -28
  204. data/samples/agg/aa_test.rb +0 -0
  205. data/samples/blur.rb +0 -0
  206. data/samples/png.rb +0 -0
  207. data/samples/scalable.rb +0 -0
  208. data/samples/text-on-path.rb +0 -0
  209. data/samples/text2.rb +0 -0
  210. data/src/cairo.def +8 -0
  211. data/src/cairo.so +0 -0
  212. data/src/lib/cairo.rb +12 -7
  213. data/src/lib/cairo/constants.rb +1 -0
  214. data/src/libruby-cairo.a +0 -0
  215. data/src/rb_cairo.c +25 -3
  216. data/src/rb_cairo.h +29 -18
  217. data/src/rb_cairo_constants.c +39 -10
  218. data/src/rb_cairo_context.c +156 -15
  219. data/src/rb_cairo_exception.c +143 -3
  220. data/src/rb_cairo_font_extents.c +81 -6
  221. data/src/rb_cairo_font_face.c +646 -4
  222. data/src/rb_cairo_font_options.c +24 -2
  223. data/src/rb_cairo_glyph.c +5 -3
  224. data/src/rb_cairo_matrix.c +17 -1
  225. data/src/rb_cairo_pattern.c +4 -4
  226. data/src/rb_cairo_private.c +169 -5
  227. data/src/rb_cairo_private.h +45 -3
  228. data/src/rb_cairo_scaled_font.c +61 -3
  229. data/src/rb_cairo_surface.c +174 -59
  230. data/src/rb_cairo_text_cluster.c +151 -0
  231. data/src/rb_cairo_text_extents.c +85 -2
  232. data/test-unit/Rakefile +30 -0
  233. data/test-unit/bin/testrb +5 -0
  234. data/test-unit/lib/test/unit.rb +280 -0
  235. data/test-unit/lib/test/unit/assertionfailederror.rb +14 -0
  236. data/test-unit/lib/test/unit/assertions.rb +722 -0
  237. data/test-unit/lib/test/unit/attribute.rb +125 -0
  238. data/test-unit/lib/test/unit/autorunner.rb +254 -0
  239. data/test-unit/lib/test/unit/collector.rb +43 -0
  240. data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
  241. data/test-unit/lib/test/unit/collector/dir.rb +108 -0
  242. data/test-unit/lib/test/unit/collector/load.rb +135 -0
  243. data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
  244. data/test-unit/lib/test/unit/color.rb +61 -0
  245. data/test-unit/lib/test/unit/diff.rb +524 -0
  246. data/test-unit/lib/test/unit/error.rb +124 -0
  247. data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
  248. data/test-unit/lib/test/unit/failure.rb +110 -0
  249. data/test-unit/lib/test/unit/fixture.rb +185 -0
  250. data/test-unit/lib/test/unit/notification.rb +125 -0
  251. data/test-unit/lib/test/unit/omission.rb +143 -0
  252. data/test-unit/lib/test/unit/pending.rb +146 -0
  253. data/test-unit/lib/test/unit/priority.rb +146 -0
  254. data/test-unit/lib/test/unit/runner/console.rb +46 -0
  255. data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
  256. data/test-unit/lib/test/unit/testcase.rb +281 -0
  257. data/test-unit/lib/test/unit/testresult.rb +89 -0
  258. data/test-unit/lib/test/unit/testsuite.rb +110 -0
  259. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
  260. data/test-unit/lib/test/unit/ui/console/testrunner.rb +195 -0
  261. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +49 -0
  262. data/test-unit/lib/test/unit/ui/testrunner.rb +20 -0
  263. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
  264. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  265. data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
  266. data/test-unit/lib/test/unit/util/observable.rb +90 -0
  267. data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
  268. data/test-unit/lib/test/unit/version.rb +7 -0
  269. data/test-unit/sample/adder.rb +13 -0
  270. data/test-unit/sample/subtracter.rb +12 -0
  271. data/test-unit/sample/tc_adder.rb +18 -0
  272. data/test-unit/sample/tc_subtracter.rb +18 -0
  273. data/test-unit/sample/ts_examples.rb +7 -0
  274. data/test-unit/test/collector/test_descendant.rb +135 -0
  275. data/test-unit/test/collector/test_dir.rb +406 -0
  276. data/test-unit/test/collector/test_load.rb +333 -0
  277. data/test-unit/test/collector/test_objectspace.rb +98 -0
  278. data/test-unit/test/run-test.rb +13 -0
  279. data/test-unit/test/test_assertions.rb +693 -0
  280. data/test-unit/test/test_attribute.rb +86 -0
  281. data/test-unit/test/test_color.rb +37 -0
  282. data/test-unit/test/test_diff.rb +477 -0
  283. data/test-unit/test/test_emacs_runner.rb +60 -0
  284. data/test-unit/test/test_error.rb +26 -0
  285. data/test-unit/test/test_failure.rb +33 -0
  286. data/test-unit/test/test_fixture.rb +252 -0
  287. data/test-unit/test/test_notification.rb +33 -0
  288. data/test-unit/test/test_omission.rb +81 -0
  289. data/test-unit/test/test_pending.rb +70 -0
  290. data/test-unit/test/test_priority.rb +89 -0
  291. data/test-unit/test/test_testcase.rb +430 -0
  292. data/test-unit/test/test_testresult.rb +113 -0
  293. data/test-unit/test/test_testsuite.rb +129 -0
  294. data/test-unit/test/testunit_test_util.rb +14 -0
  295. data/test-unit/test/ui/test_testrunmediator.rb +20 -0
  296. data/test-unit/test/util/test_backtracefilter.rb +41 -0
  297. data/test-unit/test/util/test_observable.rb +102 -0
  298. data/test-unit/test/util/test_procwrapper.rb +36 -0
  299. data/test/cairo-test-utils.rb +18 -0
  300. data/test/run-test.rb +14 -1
  301. data/test/test_constants.rb +19 -0
  302. data/test/test_context.rb +117 -0
  303. data/test/test_exception.rb +27 -0
  304. data/test/test_font_extents.rb +36 -0
  305. data/test/test_font_face.rb +244 -0
  306. data/test/test_font_options.rb +32 -0
  307. data/test/test_pkg_config.rb +3 -2
  308. data/test/test_scaled_font.rb +34 -0
  309. data/test/test_surface.rb +41 -0
  310. data/test/test_text_cluster.rb +32 -0
  311. data/test/test_text_extents.rb +40 -0
  312. data/test/test_text_to_glyphs_data.rb +47 -0
  313. metadata +129 -109
  314. data/cairo/bin/libpng13.dll +0 -0
  315. data/cairo/lib/libpng13.dll.a +0 -0
  316. data/cairo/lib/pkgconfig/libpng13.pc +0 -14
  317. data/cairo/manifest/cairo-1.6.4-1.mft +0 -6
  318. data/cairo/manifest/libpng-dev-1.2.8.mft +0 -7
  319. data/doc/en/cairo-antialias.rd +0 -16
  320. data/doc/en/cairo-clip-not-representable-error.rd +0 -17
  321. data/doc/en/cairo-color-base.rd +0 -38
  322. data/doc/en/cairo-color-cmyk.rd +0 -107
  323. data/doc/en/cairo-color-hsv.rd +0 -91
  324. data/doc/en/cairo-color-rgb.rd +0 -95
  325. data/doc/en/cairo-color-x11.rd +0 -151
  326. data/doc/en/cairo-color.rd +0 -213
  327. data/doc/en/cairo-content.rd +0 -15
  328. data/doc/en/cairo-context-blur.rd +0 -15
  329. data/doc/en/cairo-context-circle.rd +0 -15
  330. data/doc/en/cairo-context-color.rd +0 -15
  331. data/doc/en/cairo-context-path.rd +0 -19
  332. data/doc/en/cairo-context-rectangle.rd +0 -15
  333. data/doc/en/cairo-context-triangle.rd +0 -15
  334. data/doc/en/cairo-context.rd +0 -491
  335. data/doc/en/cairo-error.rd +0 -16
  336. data/doc/en/cairo-extend.rd +0 -16
  337. data/doc/en/cairo-file-not-found.rd +0 -17
  338. data/doc/en/cairo-fill-rule.rd +0 -14
  339. data/doc/en/cairo-filter.rd +0 -18
  340. data/doc/en/cairo-font-extents.rd +0 -40
  341. data/doc/en/cairo-font-face.rd +0 -14
  342. data/doc/en/cairo-font-options.rd +0 -94
  343. data/doc/en/cairo-font-slant.rd +0 -15
  344. data/doc/en/cairo-font-weight.rd +0 -14
  345. data/doc/en/cairo-format.rd +0 -22
  346. data/doc/en/cairo-glyph.rd +0 -62
  347. data/doc/en/cairo-gradient-pattern.rd +0 -41
  348. data/doc/en/cairo-hint-metrics.rd +0 -15
  349. data/doc/en/cairo-hint-style.rd +0 -17
  350. data/doc/en/cairo-image-surface.rd +0 -47
  351. data/doc/en/cairo-invalid-content-error.rd +0 -17
  352. data/doc/en/cairo-invalid-dash-error.rd +0 -17
  353. data/doc/en/cairo-invalid-dsc-comment-error.rd +0 -17
  354. data/doc/en/cairo-invalid-format-error.rd +0 -17
  355. data/doc/en/cairo-invalid-index-error.rd +0 -17
  356. data/doc/en/cairo-invalid-matrix-error.rd +0 -17
  357. data/doc/en/cairo-invalid-path-data-error.rd +0 -17
  358. data/doc/en/cairo-invalid-pop-group-error.rd +0 -17
  359. data/doc/en/cairo-invalid-restore-error.rd +0 -17
  360. data/doc/en/cairo-invalid-status-error.rd +0 -17
  361. data/doc/en/cairo-invalid-stride-error.rd +0 -17
  362. data/doc/en/cairo-invalid-string-error.rd +0 -17
  363. data/doc/en/cairo-invalid-visual-error.rd +0 -17
  364. data/doc/en/cairo-line-cap.rd +0 -15
  365. data/doc/en/cairo-line-join.rd +0 -15
  366. data/doc/en/cairo-linear-pattern.rd +0 -28
  367. data/doc/en/cairo-matrix.rd +0 -186
  368. data/doc/en/cairo-no-current-point-error.rd +0 -17
  369. data/doc/en/cairo-null-pointer-error.rd +0 -17
  370. data/doc/en/cairo-operator.rd +0 -26
  371. data/doc/en/cairo-paper-parse-error.rd +0 -17
  372. data/doc/en/cairo-paper-unknown-paper-name.rd +0 -30
  373. data/doc/en/cairo-paper-unknown-unit.rd +0 -30
  374. data/doc/en/cairo-paper-unrecognized-paper-description.rd +0 -30
  375. data/doc/en/cairo-paper.rd +0 -141
  376. data/doc/en/cairo-path-close-path.rd +0 -21
  377. data/doc/en/cairo-path-curve-to.rd +0 -21
  378. data/doc/en/cairo-path-data-type.rd +0 -16
  379. data/doc/en/cairo-path-data.rd +0 -62
  380. data/doc/en/cairo-path-line-to.rd +0 -21
  381. data/doc/en/cairo-path-move-to.rd +0 -21
  382. data/doc/en/cairo-path.rd +0 -109
  383. data/doc/en/cairo-pattern-type-mismatch-error.rd +0 -17
  384. data/doc/en/cairo-pattern.rd +0 -62
  385. data/doc/en/cairo-pdf-surface.rd +0 -27
  386. data/doc/en/cairo-point.rd +0 -42
  387. data/doc/en/cairo-ps-level.rd +0 -24
  388. data/doc/en/cairo-ps-surface.rd +0 -55
  389. data/doc/en/cairo-quartz-image-surface.rd +0 -27
  390. data/doc/en/cairo-quartz-surface.rd +0 -27
  391. data/doc/en/cairo-radial-pattern.rd +0 -28
  392. data/doc/en/cairo-read-error.rd +0 -17
  393. data/doc/en/cairo-rectangle.rd +0 -54
  394. data/doc/en/cairo-scaled-font.rd +0 -50
  395. data/doc/en/cairo-solid-pattern.rd +0 -31
  396. data/doc/en/cairo-subpixel-order.rd +0 -17
  397. data/doc/en/cairo-surface-finished-error.rd +0 -17
  398. data/doc/en/cairo-surface-pattern.rd +0 -27
  399. data/doc/en/cairo-surface-type-mismatch-error.rd +0 -17
  400. data/doc/en/cairo-surface.rd +0 -72
  401. data/doc/en/cairo-svg-surface.rd +0 -44
  402. data/doc/en/cairo-svg-version.rd +0 -24
  403. data/doc/en/cairo-temp-file-error.rd +0 -17
  404. data/doc/en/cairo-text-extents.rd +0 -44
  405. data/doc/en/cairo-win32-printing-surface.rd +0 -27
  406. data/doc/en/cairo-win32-surface.rd +0 -31
  407. data/doc/en/cairo-write-error.rd +0 -17
  408. data/doc/en/cairo.rd +0 -95
  409. data/doc/en/index.rd +0 -1051
  410. data/samples/agg/aa_demo.rb +0 -47
@@ -0,0 +1,135 @@
1
+ require 'pathname'
2
+
3
+ require 'test/unit/testsuite'
4
+ require 'test/unit/collector'
5
+
6
+ module Test
7
+ module Unit
8
+ module Collector
9
+ class Load
10
+ include Collector
11
+
12
+ attr_reader :patterns, :excludes, :base
13
+
14
+ def initialize
15
+ super
16
+ @system_excludes = [/~\z/, /\A\.\#/]
17
+ @system_directory_excludes = [/\A(?:CVS|\.svn)\z/]
18
+ @patterns = [/\Atest_.+\.rb\z/m]
19
+ @excludes = []
20
+ @base = nil
21
+ end
22
+
23
+ def base=(base)
24
+ base = Pathname(base) unless base.nil?
25
+ @base = base
26
+ end
27
+
28
+ def collect(*froms)
29
+ add_load_path(@base) do
30
+ froms = ["."] if froms.empty?
31
+ test_suites = froms.collect do |from|
32
+ test_suite = collect_recursive(from, find_test_cases)
33
+ test_suite = nil if test_suite.tests.empty?
34
+ test_suite
35
+ end.compact
36
+
37
+ if test_suites.size > 1
38
+ test_suite = TestSuite.new("[#{froms.join(', ')}]")
39
+ sort(test_suites).each do |sub_test_suite|
40
+ test_suite << sub_test_suite
41
+ end
42
+ test_suite
43
+ else
44
+ test_suites.first
45
+ end
46
+ end
47
+ end
48
+
49
+ def find_test_cases(ignore=[])
50
+ test_cases = []
51
+ TestCase::DESCENDANTS.each do |test_case|
52
+ test_cases << test_case unless ignore.include?(test_case)
53
+ end
54
+ ignore.concat(test_cases)
55
+ test_cases
56
+ end
57
+
58
+ private
59
+ def collect_recursive(name, already_gathered)
60
+ sub_test_suites = []
61
+
62
+ path = resolve_path(name)
63
+ if path.directory?
64
+ directories, files = path.children.partition do |child|
65
+ child.directory?
66
+ end
67
+
68
+ files.each do |child|
69
+ next if excluded_file?(child.basename.to_s)
70
+ collect_file(child, sub_test_suites, already_gathered)
71
+ end
72
+
73
+ directories.each do |child|
74
+ next if excluded_directory?(child.basename.to_s)
75
+ sub_test_suite = collect_recursive(child, already_gathered)
76
+ sub_test_suites << sub_test_suite unless sub_test_suite.empty?
77
+ end
78
+ else
79
+ collect_file(path, sub_test_suites, already_gathered)
80
+ end
81
+
82
+ test_suite = TestSuite.new(path.basename.to_s)
83
+ sort(sub_test_suites).each do |sub_test_suite|
84
+ test_suite << sub_test_suite
85
+ end
86
+ test_suite
87
+ end
88
+
89
+ def collect_file(path, test_suites, already_gathered)
90
+ add_load_path(path.expand_path.dirname) do
91
+ require(path.to_s)
92
+ find_test_cases(already_gathered).each do |test_case|
93
+ add_suite(test_suites, test_case.suite)
94
+ end
95
+ end
96
+ end
97
+
98
+ def resolve_path(path)
99
+ if @base
100
+ @base + path
101
+ else
102
+ Pathname(path)
103
+ end
104
+ end
105
+
106
+ def add_load_path(path)
107
+ $LOAD_PATH.push(path.to_s) if path
108
+ yield
109
+ ensure
110
+ $LOAD_PATH.delete_at($LOAD_PATH.rindex(path.to_s)) if path
111
+ end
112
+
113
+ def excluded_directory?(base)
114
+ @system_directory_excludes.any? {|pattern| pattern =~ base}
115
+ end
116
+
117
+ def excluded_file?(base)
118
+ return true if @system_excludes.any? {|pattern| pattern =~ base}
119
+
120
+ patterns = @patterns || []
121
+ unless patterns.empty?
122
+ return true unless patterns.any? {|pattern| pattern =~ base}
123
+ end
124
+
125
+ excludes = @excludes || []
126
+ unless excludes.empty?
127
+ return true if excludes.any? {|pattern| pattern =~ base}
128
+ end
129
+
130
+ false
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,34 @@
1
+ # Author:: Nathaniel Talbott.
2
+ # Copyright:: Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
3
+ # License:: Ruby license.
4
+
5
+ require 'test/unit/collector'
6
+
7
+ module Test
8
+ module Unit
9
+ module Collector
10
+ class ObjectSpace
11
+ include Collector
12
+
13
+ NAME = 'collected from the ObjectSpace'
14
+
15
+ def initialize(source=::ObjectSpace)
16
+ super()
17
+ @source = source
18
+ end
19
+
20
+ def collect(name=NAME)
21
+ suite = TestSuite.new(name)
22
+ sub_suites = []
23
+ @source.each_object(Class) do |klass|
24
+ if(Test::Unit::TestCase > klass)
25
+ add_suite(sub_suites, klass.suite)
26
+ end
27
+ end
28
+ sort(sub_suites).each{|s| suite << s}
29
+ suite
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,61 @@
1
+ module Test
2
+ module Unit
3
+ class Color
4
+ NAMES = ["black", "red", "green", "yellow",
5
+ "blue", "magenta", "cyan", "white"]
6
+ def initialize(name, options={})
7
+ @name = name
8
+ @foreground = options[:foreground]
9
+ @foreground = true if @foreground.nil?
10
+ @intensity = options[:intensity]
11
+ @bold = options[:bold]
12
+ @italic = options[:italic]
13
+ @underline = options[:underline]
14
+ end
15
+
16
+ def sequence
17
+ sequence = []
18
+ if @name == "none"
19
+ elsif @name == "reset"
20
+ sequence << "0"
21
+ else
22
+ foreground_parameter = @foreground ? 3 : 4
23
+ foreground_parameter += 6 if @intensity
24
+ sequence << "#{foreground_parameter}#{NAMES.index(@name)}"
25
+ end
26
+ sequence << "1" if @bold
27
+ sequence << "3" if @italic
28
+ sequence << "4" if @underline
29
+ sequence
30
+ end
31
+
32
+ def escape_sequence
33
+ "\e[#{sequence.join(';')}m"
34
+ end
35
+
36
+ def +(other)
37
+ MixColor.new([self, other])
38
+ end
39
+ end
40
+
41
+ class MixColor
42
+ def initialize(colors)
43
+ @colors = colors
44
+ end
45
+
46
+ def sequence
47
+ @colors.inject([]) do |result, color|
48
+ result + color.sequence
49
+ end
50
+ end
51
+
52
+ def escape_sequence
53
+ "\e[#{sequence.join(';')}m"
54
+ end
55
+
56
+ def +(other)
57
+ self.class.new([self, other])
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,524 @@
1
+ # port of Python's difflib.
2
+
3
+ module Test
4
+ module Unit
5
+ module Diff
6
+ class SequenceMatcher
7
+ def initialize(from, to, &junk_predicate)
8
+ @from = from
9
+ @to = to
10
+ @junk_predicate = junk_predicate
11
+ update_to_indexes
12
+ end
13
+
14
+ def longest_match(from_start, from_end, to_start, to_end)
15
+ best_info = find_best_match_position(from_start, from_end,
16
+ to_start, to_end)
17
+ unless @junks.empty?
18
+ args = [from_start, from_end, to_start, to_end]
19
+ best_info = adjust_best_info_with_junk_predicate(false, best_info,
20
+ *args)
21
+ best_info = adjust_best_info_with_junk_predicate(true, best_info,
22
+ *args)
23
+ end
24
+
25
+ best_info
26
+ end
27
+
28
+ def blocks
29
+ @blocks ||= compute_blocks
30
+ end
31
+
32
+ def operations
33
+ @operations ||= compute_operations
34
+ end
35
+
36
+ def grouped_operations(context_size=nil)
37
+ context_size ||= 3
38
+ _operations = operations
39
+ _operations = [[:equal, 0, 0, 0, 0]] if _operations.empty?
40
+ expand_edge_equal_operations!(_operations, context_size)
41
+
42
+ group_window = context_size * 2
43
+ groups = []
44
+ group = []
45
+ _operations.each do |tag, from_start, from_end, to_start, to_end|
46
+ if tag == :equal and from_end - from_start > group_window
47
+ group << [tag,
48
+ from_start,
49
+ [from_end, from_start + context_size].min,
50
+ to_start,
51
+ [to_end, to_start + context_size].min]
52
+ groups << group
53
+ group = []
54
+ from_start = [from_start, from_end - context_size].max
55
+ to_start = [to_start, to_end - context_size].max
56
+ end
57
+ group << [tag, from_start, from_end, to_start, to_end]
58
+ end
59
+ groups << group unless group.empty?
60
+ groups
61
+ end
62
+
63
+ def ratio
64
+ @ratio ||= compute_ratio
65
+ end
66
+
67
+ private
68
+ def update_to_indexes
69
+ @to_indexes = {}
70
+ @junks = {}
71
+ if @to.is_a?(String)
72
+ each = " "[0].is_a?(Integer) ? :each_byte : :each_char
73
+ else
74
+ each = :each
75
+ end
76
+ i = 0
77
+ @to.send(each) do |item|
78
+ @to_indexes[item] ||= []
79
+ @to_indexes[item] << i
80
+ i += 1
81
+ end
82
+
83
+ return if @junk_predicate.nil?
84
+ @to_indexes = @to_indexes.reject do |key, value|
85
+ junk = @junk_predicate.call(key)
86
+ @junks[key] = true if junk
87
+ junk
88
+ end
89
+ end
90
+
91
+ def find_best_match_position(from_start, from_end, to_start, to_end)
92
+ best_from, best_to, best_size = from_start, to_start, 0
93
+ sizes = {}
94
+ from_start.upto(from_end) do |from_index|
95
+ _sizes = {}
96
+ (@to_indexes[@from[from_index]] || []).each do |to_index|
97
+ next if to_index < to_start
98
+ break if to_index > to_end
99
+ size = _sizes[to_index] = (sizes[to_index - 1] || 0) + 1
100
+ if size > best_size
101
+ best_from = from_index - size + 1
102
+ best_to = to_index - size + 1
103
+ best_size = size
104
+ end
105
+ end
106
+ sizes = _sizes
107
+ end
108
+ [best_from, best_to, best_size]
109
+ end
110
+
111
+ def adjust_best_info_with_junk_predicate(should_junk, best_info,
112
+ from_start, from_end,
113
+ to_start, to_end)
114
+ best_from, best_to, best_size = best_info
115
+ while best_from > from_start and best_to > to_start and
116
+ (should_junk ?
117
+ @junks.has_key?(@to[best_to - 1]) :
118
+ !@junks.has_key?(@to[best_to - 1])) and
119
+ @from[best_from - 1] == @to[best_to - 1]
120
+ best_from -= 1
121
+ best_to -= 1
122
+ best_size += 1
123
+ end
124
+
125
+ while best_from + best_size < from_end and
126
+ best_to + best_size < to_end and
127
+ (should_junk ?
128
+ @junks.has_key?(@to[best_to + best_size]) :
129
+ !@junks.has_key?(@to[best_to + best_size])) and
130
+ @from[best_from + best_size] == @to[best_to + best_size]
131
+ best_size += 1
132
+ end
133
+
134
+ [best_from, best_to, best_size]
135
+ end
136
+
137
+ def matches
138
+ @matches ||= compute_matches
139
+ end
140
+
141
+ def compute_matches
142
+ matches = []
143
+ queue = [[0, @from.size, 0, @to.size]]
144
+ until queue.empty?
145
+ from_start, from_end, to_start, to_end = queue.pop
146
+ match = longest_match(from_start, from_end - 1, to_start, to_end - 1)
147
+ match_from_index, match_to_index, size = match
148
+ unless size.zero?
149
+ if from_start < match_from_index and
150
+ to_start < match_to_index
151
+ queue.push([from_start, match_from_index,
152
+ to_start, match_to_index])
153
+ end
154
+ matches << match
155
+ if match_from_index + size < from_end and
156
+ match_to_index + size < to_end
157
+ queue.push([match_from_index + size, from_end,
158
+ match_to_index + size, to_end])
159
+ end
160
+ end
161
+ end
162
+ matches.sort_by do |(from_index, to_index, match_size)|
163
+ from_index
164
+ end
165
+ end
166
+
167
+ def compute_blocks
168
+ blocks = []
169
+ current_from_index = current_to_index = current_size = 0
170
+ matches.each do |from_index, to_index, size|
171
+ if current_from_index + current_size == from_index and
172
+ current_to_index + current_size == to_index
173
+ current_size += size
174
+ else
175
+ unless current_size.zero?
176
+ blocks << [current_from_index, current_to_index, current_size]
177
+ end
178
+ current_from_index = from_index
179
+ current_to_index = to_index
180
+ current_size = size
181
+ end
182
+ end
183
+ unless current_size.zero?
184
+ blocks << [current_from_index, current_to_index, current_size]
185
+ end
186
+
187
+ blocks << [@from.size, @to.size, 0]
188
+ blocks
189
+ end
190
+
191
+ def compute_operations
192
+ from_index = to_index = 0
193
+ operations = []
194
+ blocks.each do |match_from_index, match_to_index, size|
195
+ tag = determine_tag(from_index, to_index,
196
+ match_from_index, match_to_index)
197
+ if tag != :equal
198
+ operations << [tag,
199
+ from_index, match_from_index,
200
+ to_index, match_to_index]
201
+ end
202
+
203
+ from_index, to_index = match_from_index + size, match_to_index + size
204
+ if size > 0
205
+ operations << [:equal,
206
+ match_from_index, from_index,
207
+ match_to_index, to_index]
208
+ end
209
+ end
210
+ operations
211
+ end
212
+
213
+ def compute_ratio
214
+ matches = blocks.inject(0) {|result, block| result + block[-1]}
215
+ length = @from.length + @to.length
216
+ if length.zero?
217
+ 1.0
218
+ else
219
+ 2.0 * matches / length
220
+ end
221
+ end
222
+
223
+ def determine_tag(from_index, to_index,
224
+ match_from_index, match_to_index)
225
+ if from_index < match_from_index and to_index < match_to_index
226
+ :replace
227
+ elsif from_index < match_from_index
228
+ :delete
229
+ elsif to_index < match_to_index
230
+ :insert
231
+ else
232
+ :equal
233
+ end
234
+ end
235
+
236
+ def expand_edge_equal_operations!(_operations, context_size)
237
+ tag, from_start, from_end, to_start, to_end = _operations[0]
238
+ if tag == :equal
239
+ _operations[0] = [tag,
240
+ [from_start, from_end - context_size].max,
241
+ from_end,
242
+ [to_start, to_end - context_size].max,
243
+ to_end]
244
+ end
245
+
246
+ tag, from_start, from_end, to_start, to_end = _operations[-1]
247
+ if tag == :equal
248
+ _operations[-1] = [tag,
249
+ from_start,
250
+ [from_end, from_start + context_size].min,
251
+ to_start,
252
+ [to_end, to_start + context_size].min]
253
+ end
254
+ end
255
+ end
256
+
257
+ class Differ
258
+ def initialize(from, to)
259
+ @from = from
260
+ @to = to
261
+ end
262
+
263
+ private
264
+ def tag(mark, contents)
265
+ contents.collect {|content| "#{mark}#{content}"}
266
+ end
267
+ end
268
+
269
+ class ReadableDiffer < Differ
270
+ def diff(options={})
271
+ result = []
272
+ matcher = SequenceMatcher.new(@from, @to)
273
+ matcher.operations.each do |args|
274
+ tag, from_start, from_end, to_start, to_end = args
275
+ case tag
276
+ when :replace
277
+ result.concat(diff_lines(from_start, from_end, to_start, to_end))
278
+ when :delete
279
+ result.concat(tag_deleted(@from[from_start...from_end]))
280
+ when :insert
281
+ result.concat(tag_inserted(@to[to_start...to_end]))
282
+ when :equal
283
+ result.concat(tag_equal(@from[from_start...from_end]))
284
+ else
285
+ raise "unknown tag: #{tag}"
286
+ end
287
+ end
288
+ result
289
+ end
290
+
291
+ private
292
+ def tag_deleted(contents)
293
+ tag("- ", contents)
294
+ end
295
+
296
+ def tag_inserted(contents)
297
+ tag("+ ", contents)
298
+ end
299
+
300
+ def tag_equal(contents)
301
+ tag(" ", contents)
302
+ end
303
+
304
+ def tag_difference(contents)
305
+ tag("? ", contents)
306
+ end
307
+
308
+ def find_diff_line_info(from_start, from_end, to_start, to_end)
309
+ best_ratio = 0.74
310
+ from_equal_index = to_equal_index = nil
311
+ from_best_index = to_best_index = nil
312
+
313
+ to_start.upto(to_end - 1) do |to_index|
314
+ from_start.upto(from_end - 1) do |from_index|
315
+ if @from[from_index] == @to[to_index]
316
+ from_equal_index ||= from_index
317
+ to_equal_index ||= to_index
318
+ next
319
+ end
320
+
321
+ matcher = SequenceMatcher.new(@from[from_index], @to[to_index],
322
+ &method(:space_character?))
323
+ if matcher.ratio > best_ratio
324
+ best_ratio = matcher.ratio
325
+ from_best_index = from_index
326
+ to_best_index = to_index
327
+ end
328
+ end
329
+ end
330
+
331
+ [best_ratio,
332
+ from_equal_index, to_equal_index,
333
+ from_best_index, to_best_index]
334
+ end
335
+
336
+ def diff_lines(from_start, from_end, to_start, to_end)
337
+ cut_off = 0.75
338
+
339
+ info = find_diff_line_info(from_start, from_end, to_start, to_end)
340
+ best_ratio, from_equal_index, to_equal_index, *info = info
341
+ from_best_index, to_best_index = info
342
+
343
+ if best_ratio < cut_off
344
+ if from_equal_index.nil?
345
+ tagged_from = tag_deleted(@from[from_start...from_end])
346
+ tagged_to = tag_inserted(@to[to_start...to_end])
347
+ if to_end - to_start < from_end - from_start
348
+ return tagged_to + tagged_from
349
+ else
350
+ return tagged_from + tagged_to
351
+ end
352
+ end
353
+ from_best_index = from_equal_index
354
+ to_best_index = to_equal_index
355
+ best_ratio = 1.0
356
+ end
357
+
358
+ _diff_lines(from_start, from_best_index, to_start, to_best_index) +
359
+ diff_line(@from[from_best_index], @to[to_best_index]) +
360
+ _diff_lines(from_best_index + 1, from_end, to_best_index + 1, to_end)
361
+ end
362
+
363
+ def _diff_lines(from_start, from_end, to_start, to_end)
364
+ if from_start < from_end
365
+ if to_start < to_end
366
+ diff_lines(from_start, from_end, to_start, to_end)
367
+ else
368
+ tag_deleted(@from[from_start...from_end])
369
+ end
370
+ else
371
+ tag_inserted(@to[to_start...to_end])
372
+ end
373
+ end
374
+
375
+ def diff_line(from_line, to_line)
376
+ from_tags = ""
377
+ to_tags = ""
378
+ matcher = SequenceMatcher.new(from_line, to_line,
379
+ &method(:space_character?))
380
+ operations = matcher.operations
381
+ operations.each do |tag, from_start, from_end, to_start, to_end|
382
+ from_length = from_end - from_start
383
+ to_length = to_end - to_start
384
+ case tag
385
+ when :replace
386
+ from_tags << "^" * from_length
387
+ to_tags << "^" * to_length
388
+ when :delete
389
+ from_tags << "-" * from_length
390
+ when :insert
391
+ to_tags << "+" * to_length
392
+ when :equal
393
+ from_tags << " " * from_length
394
+ to_tags << " " * to_length
395
+ else
396
+ raise "unknown tag: #{tag}"
397
+ end
398
+ end
399
+ format_diff_point(from_line, to_line, from_tags, to_tags)
400
+ end
401
+
402
+ def format_diff_point(from_line, to_line, from_tags, to_tags)
403
+ common = [n_leading_characters(from_line, ?\t),
404
+ n_leading_characters(to_line, ?\t)].min
405
+ common = [common,
406
+ n_leading_characters(from_tags[0, common], " "[0])].min
407
+ from_tags = from_tags[common..-1].rstrip
408
+ to_tags = to_tags[common..-1].rstrip
409
+
410
+ result = tag_deleted([from_line])
411
+ unless from_tags.empty?
412
+ result.concat(tag_difference(["#{"\t" * common}#{from_tags}"]))
413
+ end
414
+ result.concat(tag_inserted([to_line]))
415
+ unless to_tags.empty?
416
+ result.concat(tag_difference(["#{"\t" * common}#{to_tags}"]))
417
+ end
418
+ result
419
+ end
420
+
421
+ def n_leading_characters(string, character)
422
+ n = 0
423
+ while string[n] == character
424
+ n += 1
425
+ end
426
+ n
427
+ end
428
+
429
+ def space_character?(character)
430
+ [" "[0], "\t"[0]].include?(character)
431
+ end
432
+ end
433
+
434
+ class UnifiedDiffer < Differ
435
+ def diff(options={})
436
+ groups = SequenceMatcher.new(@from, @to).grouped_operations
437
+ return [] if groups.empty?
438
+ return [] if same_content?(groups)
439
+
440
+ show_context = options[:show_context]
441
+ show_context = true if show_context.nil?
442
+ result = ["--- #{options[:from_label]}".rstrip,
443
+ "+++ #{options[:to_label]}".rstrip]
444
+ groups.each do |operations|
445
+ result << format_summary(operations, show_context)
446
+ operations.each do |args|
447
+ operation_tag, from_start, from_end, to_start, to_end = args
448
+ case operation_tag
449
+ when :replace
450
+ result.concat(tag("-", @from[from_start...from_end]))
451
+ result.concat(tag("+", @to[to_start...to_end]))
452
+ when :delete
453
+ result.concat(tag("-", @from[from_start...from_end]))
454
+ when :insert
455
+ result.concat(tag("+", @to[to_start...to_end]))
456
+ when :equal
457
+ result.concat(tag(" ", @from[from_start...from_end]))
458
+ end
459
+ end
460
+ end
461
+ result
462
+ end
463
+
464
+ private
465
+ def same_content?(groups)
466
+ return false if groups.size != 1
467
+ group = groups[0]
468
+ return false if group.size != 1
469
+ tag, from_start, from_end, to_start, to_end = group[0]
470
+
471
+ tag == :equal and [from_start, from_end] == [to_start, to_end]
472
+ end
473
+
474
+ def format_summary(operations, show_context)
475
+ _, first_from_start, _, first_to_start, _ = operations[0]
476
+ _, _, last_from_end, _, last_to_end = operations[-1]
477
+ summary = "@@ -%d,%d +%d,%d @@" % [first_from_start + 1,
478
+ last_from_end - first_from_start,
479
+ first_to_start + 1,
480
+ last_to_end - first_to_start,]
481
+ if show_context
482
+ interesting_line = find_interesting_line(first_from_start,
483
+ first_to_start,
484
+ :define_line?)
485
+ summary << " #{interesting_line}" if interesting_line
486
+ end
487
+ summary
488
+ end
489
+
490
+ def find_interesting_line(from_start, to_start, predicate)
491
+ from_index = from_start
492
+ to_index = to_start
493
+ while from_index >= 0 or to_index >= 0
494
+ [@from[from_index], @to[to_index]].each do |line|
495
+ return line if line and send(predicate, line)
496
+ end
497
+
498
+ from_index -= 1
499
+ to_index -= 1
500
+ end
501
+ nil
502
+ end
503
+
504
+ def define_line?(line)
505
+ /\A(?:[_a-zA-Z$]|\s*(?:class|module|def)\b)/ =~ line
506
+ end
507
+ end
508
+
509
+ module_function
510
+ def readable(from, to, options={})
511
+ diff(ReadableDiffer, from, to, options)
512
+ end
513
+
514
+ def unified(from, to, options={})
515
+ diff(UnifiedDiffer, from, to, options)
516
+ end
517
+
518
+ def diff(differ_class, from, to, options={})
519
+ differ = differ_class.new(from.split(/\r?\n/), to.split(/\r?\n/))
520
+ differ.diff(options).join("\n")
521
+ end
522
+ end
523
+ end
524
+ end